Cass图如何转换成pdf图:SVG转换成 PDF

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

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

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

我有这种感觉,必须有一个 API 来做到这一点很简单,由 FOP 或蜡染提供,但我只是无法找到它的时刻(或者也许它真的不存在。)

在我需要的支持 SVG 功能方面,该文件有一些填充了一些线性梯度的路径。

理想情况下,如果我可以将 SVG 作为理想的 DOM 文档传递;然后我将加载我的模板 SVG 文件,按照用户指定的方式更改它,然后生成 PDF。

23

感谢 Adrian 展示了 Batik rasterizer 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

重要的一点是,TranscoderInputTranscoderOutput可以处理任何InputStreamOutputStream,而不仅仅是文件流。请注意,其中一个构造函数采用org.w3c.dom.Document,这意味着您甚至不需要将 SVG DOM 序列化为 SVG 字符串,从而节省了额外的步骤。

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

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

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

Edit:

虽然简单的命令行编译仅适用于batik-rasterizer.jar,但它正在执行某种类加载器魔术来查找所有必要的类。在更实际的情况下(使用 Ant 构建项目),您必须手动查找类。它们可以在the Batik projectbatik-1.7.zipfop-1.1.zip中找到,与the FOP project一起运行

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-pr.jar batik-script.jar batik-svg-dom.jar batik-util.jar batik-xml.jar xml-a-ext.jar

从 FOP,您需要使用fop.jar编译并运行

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

我终于设法找到适当的代码行来解决这个问题使用Batik

您需要将 SVG 文件和生成的 PDF 作为磁盘上的文件,即我找不到在内存中执行此操作的方法(我正在编写 HTTP Servlet,因此我没有内在需要将任何内容作为文件写入,理想情况下,我会将结果流式传输到 HTTP 客户端)。

所以我使用的行如下:

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(使用谷歌搜索找到项目并下载它们):

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-a-ext.jar

xmlgraphics-commons-1.3.1.jar

4

你需要一个 libray 来渲染 svg 和 pdf。我建议前者SVG sander,后者iText。使用 svg sander,您可以读取 svg 并创建一个图像对象,使用 itext,您可以将该图像写入 pdf。

1

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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(189)
Rfid是什么:是什么让RFID给卡“授予访问权限”(access rfid)
上一篇
Chthonic乐队:如何绘制乐队结构 (band structure plot)
下一篇

相关推荐

  • css禅意花园pdf用简单的代码让网页变得更美

    CSS Zen Garden(CSS禅意花园)是一个由Dave Shea于2003年创建的网站,旨在展示CSS的功能。该网站提供了一个HTML文档,该文档包含一系列用CSS样式表格式化的元素,但没有任何表示外观的CSS代码。任何人都可以使用此HTML文档,并通过改变CSS样式表来改变文档的外观。…

    2023-07-21 06:36:31
    0 67 27
  • qt quick核心编程pdf深入理解Qt Quick的基础和应用

    Qt Quick Core Programming是一本关于Qt Quick的技术书籍,主要介绍了Qt Quick的基础知识、技术和应用。书中介绍了Qt Quick的基本原理、基本概念、核心功能和实际应用,并结合代码实例,帮助读者更好地理解Qt Quick的核心概念和应用。…

    2023-03-11 11:23:40
    0 56 23
  • javascript权威指南 pdf从入门到精通

    示例示例权威指南 pdf是一本关于编程的书,由David 编写,旨在帮助读者深入理解的各个方面。它介绍了的基本语法,并讨论了如何使用它来创建动态Web页面。此外,它还提供了有关DOM,Ajax,JSON, HTML5,CSS3和其他最新Web技术的信息。以下是一个简单的代码示例:…

    2023-05-21 09:33:58
    0 99 47
  • Dcm文件:如何将.dcm文件转换为pdf文件

    关于Dcm文件的问题,在convert dcm to pdf中经常遇到,要转换 pdf 文件,我使用了 pdf2dcm.java 类。但是,现在我需要将 dicom 文件转换为 pdf,以便读取文档的内容。如何做到这一点?是否有任何 java 类能够做到这一点?…

    2024-01-08 08:23:08
    0 70 76
  • Ye al:whatsapperroralenviarpdf "Fallo alcomparter"

    关于Ye al的问题,在como mandar una foto en pdf por whatsapp中经常遇到,Tengo una app proploa que envia un pdf al whatsapp,lo hacia todo bien,pero desde hace un tiempo el whatsapp (solo en esta app) me dice“Fallo al comparator……”y no lo puedo enviar.He actualizado la app y el gradle pero nada de nada…

    2023-11-19 15:27:30
    0 84 13
  • 怎样合并多个pdf文件:合并 /组合多个PDF文件(combiné pdf)

    关于怎样合并多个pdf文件的问题,在combiné pdf中经常遇到,我需要在第三个文件夹中合并 / 组合所有具有相同名称的 PDF 文件,即结果文件夹(文件夹 3)将包含 1000 个文件,每个文件将是文件夹 1 和文件夹 2 文件的合并形式,具有相同的名称。…

    2024-03-24 08:46:36
    0 51 58
  • Gs认证和ce认证的区别:PDF的“认证”和“签名”之间的区别(what is a certified pdf)

    关于Gs认证和ce认证的区别的问题,在what is a certified pdf中经常遇到,我正在开发一个将签署 pdf 文档的脚本。我使用 tcpdf 和 tcpdi。我有.key 私钥,passphrase 和.pem 证书。我使用函数:…

    2023-11-12 03:36:43
    0 16 59
  • Pdf转word免费软件:使用 C#编程使用免费软件库压缩现有的PDF

    关于Pdf转word免费软件的问题,在condese pdf中经常遇到,我一直在谷歌上搜索很多关于如何压缩现有的pdf(大小)。我的问题是…

    2024-03-27 14:38:52
    0 75 29

发表评论

登录 后才能评论

评论列表(83条)