58

我想将 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 个不同的文本块。有没有办法修复上面的代码?或者请建议另一种更有效的解决方案。

4

7 回答 7

65

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() 是同步的,并且仅在过程完成后才返回(尽管我对此不是 100% 确定),因此您应该能够在此之后读取“out.svg”。无论如何,谷歌搜索“java系统调用”将产生更多关于如何正确执行该部分的信息。

于 2010-11-08T12:12:20.117 回答
44

看看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/

于 2010-12-21T17:18:16.820 回答
7

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

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

pdftocairo -svg -f 1 -l 1 input.pdf
于 2020-04-22T03:40:46.990 回答
2
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
于 2017-10-10T06:40:37.740 回答
0

inkscape( @jbeard4) 对我来说,制作的 svg 中根本没有文字,但我能够通过使用 ghostscript 将 postscript 作为中介来使其工作。

for page in $(seq 1 `pdfinfo $1.pdf | awk '/^Pages:/ {print $2}'`)
do
    pdf2ps -dFirstPage=$page -dLastPage=$page -dNoOutputFonts $1.pdf $1_$page.ps
    inkscape -z -l $1_$page.svg $1_$page.ps
    rm $1_$page.ps
done

然而,这有点麻烦,并且易于使用的获胜者必须转到 pdf2svg ( @Koen.),因为它具有该all标志,因此您不需要循环。

但是pdf2svg在 CentOS 8 上不可用,要安装它,您需要执行以下操作:

git clone https://github.com/dawbarton/pdf2svg.git && cd pdf2svg
#if you dont have development stuff specific to this project
sudo dnf config-manager --set-enabled powertools
sudo dnf install cairo-devel poppler-glib-devel
#git repo isn't quite ready to ./configure
touch README
autoreconf -f -i
./configure && make && sudo make install

它产生的 svgs 实际上看起来比上面的 ghostscript-inkscape 更好,字体似乎更好。

pdf2svg $1.pdf $1_%d.svg all

但是即使你没有 sudo,那个安装也有点多,太多了。最重要的是,pdf2svg 不支持 stdin/stdout,因此现成的pdftocairo( @SuperNova) 在这些方面发挥了作用,下面是“高级”使用的示例:

for page in $(seq 1 `pdfinfo $1.pdf | awk '/^Pages:/ {print $2}'`)
do
    pdftocairo -svg -f $page -l $page $1.pdf - | gzip -9 >$1_$page.svg.gz
done

它产生与pdf2svg相同质量和大小(压缩前)的文件,虽然不是二进制相同的(甚至在视觉上,在两个字母的输出之间跳跃一些像素移位,但看起来都不像inkscape那样错误/糟糕)。

于 2021-05-07T08:29:05.670 回答
0

为什么不尝试使用Spire.PDF for .NET呢?它也有免费版本,使用它提供的方法,任何人都可以按照以下代码将 PDF 文件转换为 SVG 图像:

using Spire.Pdf;

namespace PDF_Page_to_SVG
{
    class Program
    {
        static void Main(string[] args)
        {
            PdfDocument doc = new PdfDocument();
            doc.LoadFromFile("Test.pdf");
            doc.SaveToFile("Result.svg", 0, 0, FileFormat.SVG);
        }
    }
}
于 2022-02-23T05:33:26.460 回答
0

我在尝试转换大型复杂 PDF(例如来自 USGS 的一些地形图)时遇到了建议inkscape的 、pdf2svg、和pdftocairo不建议的问题。有时它们会崩溃,有时它们会产生大量膨胀的文件。唯一能够为我的用例正确处理所有这些的 PDF 到 SVG 转换工具是dvisvgm。使用它非常简单:convertmutool

dvisvgm --pdf --output=file.svg file.pdf

它有各种额外的选项来处理元素的转换方式以及优化。如有必要,其生成的文件可以通过svgcleaner进一步压缩,而不会造成感知质量损失。

于 2021-05-21T16:41:08.140 回答