将pdf转换为svg [英] convert pdf to svg

查看:123
本文介绍了将pdf转换为svg的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to convert PDF to SVG please suggest some libraries/executable that will be able to do this efficiently. I have written my own java program using the apache PDFBox and Batik libraries -

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 个不同的文本块.有没有办法修复上面的代码?或者请提出其他更有效的解决方案.

This solution works great but the size of the resulting svg files in huge.(many times greater than the pdf). I have figured out where the problem is by looking at the svg in a text editor. it encloses every character in the original document in its own block even if the font properties of the characters is the same. For example the word hello will appear as 6 different text blocks. Is there a way to fix the above code? or please suggest another solution that will work more efficiently.

推荐答案

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

Inkscape can also be used to convert PDF to SVG. It's actually remarkably good at this, and although the code that it generates is a bit bloated, at the very least, it doesn't seem to have the particular issue that you are encountering in your program. I think it would be challenging to integrate it directly into Java, but inkscape provides a convenient command-line interface to this functionality, so probably the easiest way to access it would be via a system call.

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

To use Inkscape's command-line interface to convert a PDF to an SVG, use:

inkscape -l out.svg in.pdf

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

Which you can then probably call using:

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() 是同步的,只有在进程完成后才返回(虽然我不是 100% 确定),所以在那之后你应该能够读取out.svg".在任何情况下,谷歌搜索java 系统调用"将产生更多关于如何正确执行该部分的信息.

I think exec() is synchronous and only returns after the process completes (although I'm not 100% sure on that), so you shoudl be able to just read "out.svg" after that. In any case, Googling "java system call" will yield more info on how to do that part correctly.

这篇关于将pdf转换为svg的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆