当前位置: 首页 > 面试题库 >

将SVG转换为PDF

董永宁
2023-03-14
问题内容

如何以编程方式将SVG文件转换为PDF?(在生成PDF之前,我需要在某些方面进行更改,因此仅使用工具进行预转换就不够了。)

理想情况下,使用Java但Perl或PHP也可以。

显然,我基本上是在考虑使用Java的Apache
FOP和Batik。但是,无论我搜索多长时间,都无法找到有关该操作方法的简单介绍。诸如SVGConverter之类的内容具有“为能够转换部分或全部GraphicContext的类定义接口”之类的描述,但是我真的不知道这意味着什么。

我有一种感觉,必须有一个由FOP或Batik提供的非常简单的API来执行此操作,但是我暂时无法找到它(或者也许它确实不存在。)

就我需要的受支持的SVG功能而言,该文件具有一些路径,其中填充了一些线性渐变。

理想情况下,如果我可以将SVG作为DOM文档传递,那将是理想的选择;然后我将加载我的模板SVG文件,根据用户的指定进行更改,然后生成PDF。


问题答案:

感谢Adrian展示了应该如何使用Batik光栅化器API。但是,我需要一个更轻量的解决方案–
我无法写入临时文件,并且我希望更少的依赖关系。因此,从他指出的方法开始,我找到了一种访问较低级代码进行转换的方法,而没有其他方法。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import org.apache.batik.transcoder.Transcoder;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.fop.svg.PDFTranscoder;

public class Test {
    public static void main(String[] argv) throws TranscoderException, FileNotFoundException {
        Transcoder transcoder = new PDFTranscoder();
        TranscoderInput transcoderInput = new TranscoderInput(new FileInputStream(new File("/tmp/test.svg")));
        TranscoderOutput transcoderOutput = new TranscoderOutput(new FileOutputStream(new File("/tmp/test.pdf")));
        transcoder.transcode(transcoderInput, transcoderOutput);
    }
}

编译并运行命令是

javac -cp batik-rasterizer.jar -d build Test.java
java -cp build:batik-rasterizer.jar Test

重要的一点是,TranscoderInput并且TranscoderOutput可以与InputStream和一起使用OutputStream,而不仅仅是文件流。请注意,其中一个构造函数采用org.w3c.dom.Document,这意味着您甚至不需要将SVG
DOM序列化为SVG字符串,从而节省了额外的步骤。

与高级API不同,此版本也不向stdout / stderr写入任何内容。

对于JPEG,PNG或TIFF输出,请替换org.apache.fop.svg.PDFTranscoderorg.apache.batik.transcoder.image.JPEGTranscoderPNGTranscoderTIFFTranscoder(请注意,这些栅格格式在不同的包装中)。

(我不太确定Java如何找到org.apache.batk.transcoder.*org.apache.fop.svg.PDFTranscoder类,因为我没有在中看到它们batik- rasterizer.jar。)

编辑:

尽管简单的命令行编译batik- rasterizer.jar仅适用于该命令,但是它正在执行某种类加载器的魔力来查找所有必需的类。在更实际的情况下(使用Ant构建项目),您必须手动查找类。他们可以发现batik-1.7.zip从蜡染项目,并fop-1.1.zip从该项目的FOP。在蜡染中,您需要进行编译batik- transcoder.jar和运行

  • batik-transcoder.jar
  • batik-anim.jar
  • batik-awt-util.jar
  • batik-bridge.jar
  • batik-css.jar
  • batik-dom.jar
  • batik-ext.jar
  • batik-gvt.jar
  • batik-parser.jar
  • batik-script.jar
  • batik-svg-dom.jar
  • batik-util.jar
  • batik-xml.jar
  • xml-apis-ext.jar

在FOP中,您需要进行编译fop.jar和运行

  • fop.jar
  • avalon-framework-4.2.0.jar
  • xmlgraphics-commons-1.5.jar


 类似资料:
  • 问题内容: 我正在使用d3.js可视化一些数据。我希望能够采用它生成的SVG代码并将其存储为图像文件(用于在Inkscape / Illustrator中进行编辑)。 我试过简单地复制svg标签的内容,即 放入名为image.svg的文件中,但这会漏掉两个单独的CSS文件中的颜色/样式信息。 有没有简单的方法可以做到这一点? 问题答案: 我认为SVG Crowbar可能是解决此问题的最佳方法。

  • 问题内容: 我在ttf文件中有一种字体,想要生成文本转换为路径的SVG。我不需要图像(因此使用imagettftext或Image Magick字体渲染功能是不够的),我需要可以放大和缩小的形状,我想丢失有关所用字体的信息,并且不想在其中引用它SVG文件(因此此处不能使用字体声明)。可能吗? 问题答案: 我创建了自己的类来处理SVG字体文件并将文本转换为字形。使用示例: 结果示例: 我班的代码:

  • 我想发送一个内联SVG图像到PHP脚本转换为PNG与Imagick.为此,我必须知道如何在内联SVG上获得一个Base64字符串。对于画布对象,它是一个简单的“. toDataURL()”,但这不适用于内联SVG,因为它不是元素的全局函数。 http://jsfiddle.net/nikolang/ccx195qj/1/ 但是如何为内联SVG实现这一点?

  • 问题内容: 我希望从该网站的mma 数据中抓取数据并解析一些highcharts表。我单击的链接与selenium,然后切换到图表。我转到该站点,然后在Artem Lobov行的Pinnacle列中单击+420。这将创建一个弹出图表。然后,我切换到活动元素。我想捕获由highcharts绘制的图形以响应点击。 我以以下方式使用selenium: 我能够单击链接并获得图表,但我对highcharts

  • 我有一个svg精灵,如下所示: 现在我的问题是:我可以通过提取符号然后用svg-tag替换符号标签来制作一个svg吗?或者我如何实现这种转换以分离svg? 我想到了一个小脚本,它可以从上面的svg精灵中注入几个svg图标,这样图标可以更好地/单独地由css设置样式。 这里的事情是,在精灵中有一些符号,(据我所知)这些符号只能与