Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将SVG转换为PDF_Java_Pdf_Svg - Fatal编程技术网

Java 将SVG转换为PDF

Java 将SVG转换为PDF,java,pdf,svg,Java,Pdf,Svg,如何通过编程将SVG文件转换为PDF?(在生成PDF之前,我需要在某些方面修改SVG,因此仅使用工具对其进行预转换是不够的。) 理想情况下使用Java,但也可以使用Perl或PHP 显然,我基本上是在考虑使用Java的ApacheFop和Batik。然而,无论我搜索多长时间,我都找不到一个简单的介绍如何做。类似这样的描述有“为能够转换部分或全部GraphicContext的类定义接口”,但我真的不知道这意味着什么 我有这样的感觉,必须有一个API来做这件事非常简单,由FOP或Batik提供,但我

如何通过编程将SVG文件转换为PDF?(在生成PDF之前,我需要在某些方面修改SVG,因此仅使用工具对其进行预转换是不够的。)

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

显然,我基本上是在考虑使用Java的ApacheFop和Batik。然而,无论我搜索多长时间,我都找不到一个简单的介绍如何做。类似这样的描述有“为能够转换部分或全部GraphicContext的类定义接口”,但我真的不知道这意味着什么

我有这样的感觉,必须有一个API来做这件事非常简单,由FOP或Batik提供,但我只是无法找到它目前(或者它真的不存在)

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


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

您将需要一个库来呈现SVG和PDF。
我推荐前者,也推荐后者。使用svg salamander,您可以读取svg并创建一个图像对象,使用itext,您可以将该图像写入pdf。

我终于找到了相应的代码行,使用

您需要将SVG文件和生成的PDF作为文件放在磁盘上,也就是说,我找不到在内存中执行此操作的方法(我正在编写一个HTTP Servlet,因此我不需要将任何内容作为文件写入,理想情况下,我会将结果流式传输到HTTP客户端)。我曾经创建一个文件,将SVG转储到一个文件中,并将生成的PDF写入其中

因此,我使用的行如下所示:

import org.apache.batik.apps.rasterizer.DestinationType;
import org.apache.batik.apps.rasterizer.SVGConverter;
import ...

// SVG available as a DOM object (created programatically by my program)
Document svgXmlDoc = ...

// Save this SVG into a file (required by SVG -> PDF transformation process)
File svgFile = File.createTempFile("graphic-", ".svg");
Transformer transformer = TransformerFactory.newInstance().newTransformer();
DOMSource source2 = new DOMSource(svgXmlDoc);
FileOutputStream fOut = new FileOutputStream(svgFile);
try { transformer.transform(source2, new StreamResult(fOut)); }
finally { fOut.close(); }

// Convert the SVG into PDF
File outputFile = File.createTempFile("result-", ".pdf");
SVGConverter converter = new SVGConverter();
converter.setDestinationType(DestinationType.PDF);
converter.setSources(new String[] { svgFile.toString() });
converter.setDst(outputFile);
converter.execute();
我有以下JAR(使用Google搜索并下载项目):

  • avalon-framework-4.2.0.jar
  • 蜡染全部1.7.jar
  • commons-io-1.3.1.jar
  • commons-logging-1.0.4.jar
  • fop-0.95.jar
  • log4j-1.2.15.jar
  • xml-api-ext.jar
  • xmlgraphics-commons-1.3.1.jar

我使用Altsoft Xml2PDF。如果我正确理解了您的所有需求,您最好试试他们的服务器版本的Xml2PDF

感谢阿德里安展示了蜡染光栅化器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
重要的一点是,and可以处理任何and,而不仅仅是文件流。注意,其中一个构造函数采用了,这意味着您甚至不需要将SVG DOM序列化为SVG字符串,从而节省了额外的步骤

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

对于JPEG、PNG或TIFF输出,将
org.apache.fop.svg.PDFTranscoder
替换为
org.apache.batik.transcoder.image.JPEGTranscoder
PNGTranscoder
TIFFTranscoder
(注意,这些光栅格式位于不同的包中)

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

编辑:

虽然简单的命令行编译只适用于
batik rasterizer.jar
,但它在做一些类装入器魔术来查找所有必需的类。在更现实的情况下(使用Ant构建项目),必须手动查找类。它们可以在中找到
batik-1.7.zip
from和
fop-1.1.zip
from。在Batik中,您需要使用
Batik transcoder.jar进行编译并使用运行

  • 蜡染转码器.jar
  • batik动画罐
  • 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-api-ext.jar
在FOP中,您需要使用
FOP.jar进行编译并使用运行

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

您所需要的只是幻影。你根本不需要笨重的蜡染;您可以运行phantomjs,调用rasterize.js,使用pdf的url作为源,使用位置作为输出。根据您想用.pdf做什么,您甚至不需要Java


请看以“除PNG格式外,PhantomJS还支持JPEG、GIF和PDF”开头的部分。

有关链接的API,请参见此处:谢谢提示!唉,我是在Linux上部署的,这个解决方案似乎是Windows-only。这是非常有创意的,但总的来说,这可能不是更好的方法。根据用例的不同,您可能希望保留SVG中的矢量,而不是光栅化文档。