我想将PDF转换为SVG,请建议一些能够有效执行此操作的库/可执行文件。我已经使用Apache PDFBox和Batik库编写了自己的Java程序 -

PDDocument document = PDDocument.load( pdfFile );
DOMImplementation domImpl =
    GenericDOMImplementation.getDOMImplementation();

// Create an instance of org.w3c.dom.Document.
String svgNS = "http://www.w3.org/2000/svg";
Document svgDocument = domImpl.createDocument(svgNS, "svg", null);
SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(svgDocument);
ctx.setEmbeddedFontsOn(true);

// Ask the test to render into the SVG Graphics2D implementation.

    for(int i = 0 ; i < document.getNumberOfPages() ; i++){
        String svgFName = svgDir+"page"+i+".svg";
        (new File(svgFName)).createNewFile();
        // Create an instance of the SVG Generator.
        SVGGraphics2D svgGenerator = new SVGGraphics2D(ctx,false);
        Printable page  = document.getPrintable(i);
        page.print(svgGenerator, document.getPageFormat(i), i);
        svgGenerator.stream(svgFName);
    }

该解决方案效果很好,但最大的SVG文件的大小庞大。(比PDF大很多)。我通过在文本编辑器中查看SVG来弄清楚问题所在。即使字符的字体属性相同,它也将原始文档中的每个字符封闭在其自身块中。例如,“ Hello”一词将显示为6个不同的文本块。有没有办法修复上述代码?或者,请建议另一种将更有效地工作的解决方案。

有帮助吗?

解决方案

Inkscape也可用于将PDF转换为SVG。实际上,它非常出色,尽管它生成的代码有些肿,但至少,它似乎并没有您在程序中遇到的特定问题。我认为将其直接集成到Java中是一项挑战,但是Inkscape为此功能提供了方便的命令行界面,因此可能是通过系统调用来访问它的最简单方法。

要使用Inkscape的命令行接口将PDF转换为SVG,请使用:

inkscape -l out.svg in.pdf

然后,您可能可以使用以下方式致电:

Runtime.getRuntime().exec("inkscape -l out.svg in.pdf")

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/runtime.html#exec%28java.lang.string%29

我认为exec()是同步的,并且仅在过程完成后才返回(尽管我不确定这一点),因此您可以在此之后仅阅读“ out.svg”。无论如何,谷歌搜索“ Java系统调用”将获得有关如何正确执行该部分的更多信息。

其他提示

看一眼 PDF2SVG:

使用

pdf2svg <input.pdf> <output.svg> [<pdf page no. or "all" >]

使用时 all 带有文件名 %d 在其中(将被页码替换)。

pdf2svg input.pdf output_page%d.svg all

有关一些故障排除,请参阅:http://www.calcmaster.net/personal_projects/pdf2svg/

pdftk 82page.pdf burst
sh to-svg.sh 

内容 to-svg.sh

#!/bin/bash
FILES=burst/*
for f in $FILES
do
  inkscape -l "$f.svg" "$f"
done
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top