将pdf转换为svg

use*_*541 50 pdf svg batik pdfbox

我想将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);
    }
Run Code Online (Sandbox Code Playgroud)

这个解决方案效果很好但是生成的svg文件的大小很大.(比pdf大很多倍).通过在文本编辑器中查看svg,我已经找到了问题所在.即使字符的字体属性相同,它也会将原始文档中的每个字符都包含在自己的块中.例如,单词hello将显示为6个不同的文本块.有没有办法修复上面的代码?或者请建议另一种更有效的解决方案.

jbe*_*rd4 59

Inkscape也可用于将PDF转换为SVG.它实际上非常擅长这一点,虽然它生成的代码有点臃肿,但至少它似乎没有你在程序中遇到的特定问题.我认为将它直接集成到Java中具有挑战性,但是inkscape为这个功能提供了一个方便的命令行界面,因此访问它的最简单方法可能是通过系统调用.

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

inkscape -l out.svg in.pdf
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下方法调用:

Runtime.getRuntime().exec("inkscape -l out.svg in.pdf")
Run Code Online (Sandbox Code Playgroud)

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

我认为exec()是同步的,只有在进程完成后才会返回(虽然我不是100%肯定),所以你应该在那之后只读"out.svg".在任何情况下,谷歌搜索"java系统调用"将提供有关如何正确执行该部分的更多信息.

  • 我使用了inkscape命令行方法,但svg中的字体看起来很难看.有办法解决吗? (2认同)

Koe*_*en. 34

看看pdf2svg:

使用

pdf2svg <input.pdf> <output.svg> [<pdf page no. or "all" >]
Run Code Online (Sandbox Code Playgroud)

使用时all给出一个文件名%d(将被页码替换).

pdf2svg input.pdf output_page%d.svg all
Run Code Online (Sandbox Code Playgroud)

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

  • 我一直在使用pdf2svg,但我发现它比inkscape更接近于近似值.特别是在渲染小圆圈时你会丢失细节(我正在处理100,000个路径的pdf).因人而异. (5认同)
  • @AidanKane:另一方面,pdf2svg在文本方面比Inkscape更好; 来自LaTeX输出文件的文本没有显示在Inkscape的输出中. (5认同)

Sup*_*ova 7

pdftocairo可用于将pdf转换为svg。pdfcairo是 poppler-utils 的一部分。

例如要转换 pdf 的第二页,可以运行以下命令。

pdftocairo -svg -f 1 -l 1 input.pdf
Run Code Online (Sandbox Code Playgroud)