当前位置: 首页 > 知识库问答 >
问题:

用Apache Batik将SVG转换为PNG,然后用PDFBox附加到PDF而不保存图像

井学
2023-03-14

因此,正如标题所说,我正在寻找一种方法,用Apache Batik将SVG转换为PNG,然后使用PDFBox将此图像附加到PDF文件,而不实际在任何地方创建SVG和PNG。

目前,我有一个web表单,有SVG图像与可选择的部分。当提交表单时,我接受svg的“html”部分,这意味着我将 保存在一个字符串中,然后Spring使用该字符串在给定文件夹中创建“.svg”文件,然后Batik在同一个文件夹中创建一个PNG文件,然后PDFBox将其附加到PDF中--这很好(代码如下)。

//Get the svg data from the Form and Create the svg file
String svg = formData.getSvg();
File svgFile = new File("image.svg");
BufferedWriter writer = new BufferedWriter(new FileWriter(svgFile));
writer.write(svg);
writer.close(); 
// Send to Batik to turn to PNG
PNGTranscoder pngTranscode = new PNGTranscoder();
File svgFile = new File("image.svg");
InputStream in = new FileInputStream(svgFile);
TranscoderInput tIn = new TranscoderInput(in);
OutputStream os = new FileOutputStream("image.png");
TranscoderOutput tOut = new TranscoderOutput(os)
pngTranscode .transcode(tIn , tOut);
os.flush();
os.close();
//Send to PDFBox to attach to pdf
File pngfile = new File("image.png");
String path = pngfile.getAbsolutePath();                    
PDImageXObject pdImage = PDImageXObject.createFromFile(path, pdf);
PDPageContentStream contents = new PDPageContentStream(pdf, pdf.getPage(1));
contents.drawImage(pdImage, 0, pdf.getPage(1).getMediaBox().getHeight() - pdImage.getHeight()); 
contents.close();

正如您所看到的,有很多文件和东西(需要稍微整理一下),但是在运行过程中是否可以在不创建和不断获取svg和png文件的情况下这样做呢?

共有1个答案

方绪
2023-03-14

根据注释中的建议,我选择使用ByteArrayOutputStream、ByteArrayInputStream、BufferedImage和LossLessFactory。它比保存要慢一点(如果您在调试中查看它,在创建映像之前,BufferedImage会先去度假)。我发现使用的源代码是:如何将SVG转换成动态的PNG和使用pdfbox将Byte[]打印成pdf

byte[] streamBytes = IOUtils.toByteArray(new ByteArrayInputStream(formData.getSvg().getBytes()));
PNGTranscoder pngTranscoder = new PNGTranscoder();
ByteArrayOutputStream os = new ByteArrayOutputStream();                  
pngTranscoder.transcode(new TranscoderInput(new ByteArrayInputStream(streamBytes)), new TranscoderOutput(os));
InputStream is = new ByteArrayInputStream(os.toByteArray());
BufferedImage bim = ImageIO.read(is);
PDImageXObject pdImage = LosslessFactory.createFromImage(pdf, bim);
PDPageContentStream contents = new PDPageContentStream(pdf, pdf.getPage(1));
contents.drawImage(pdImage, 0, pdf.getPage(1).getMediaBox().getHeight() - pdImage.getHeight()); 
contents.close();
 类似资料:
  • 当使用PDFBox将PDF(可填充)转换为Jpeg时。复选框中的勾号将转换为方框字符 警告[org.apache.pdfbox.rendering.type1glyph2d]代码52(a20)没有字形,字体为ZapfDingbats public static void main(String[]args)引发异常{ 我如何设置字体到PDF图像代码?

  • 目前我正在尝试将PDF转换为PDF/A。 然而,不知何故,我不知道我是否可以转换色彩空间,有没有办法这样做? 这是我的代码,然而: 色彩空间被添加但是在验证我得到: 对于每个页面/元素,它都经常出现。 我能做点什么来反对它吗?比如转换颜色空间?使用她的图书馆?

  • 当我试图使用pdfBox绘制png图像时,页面保持空白。有什么方法可以使用PDFBOX插入png图像吗?

  • 我已经阅读了文档和示例,但我很难将其全部整理在一起。我只是尝试获取一个测试pdf文件,然后将其转换为字节数组,然后获取字节数组并将其转换回pdf文件,然后将pdf文件创建到磁盘上。 它可能没有多大帮助,但这是我目前得到的:

  • 有人能给我举个例子,说明如何使用ApachePDFBox转换不同图像中的PDF文件(PDF的每一页对应一个图像)?

  • 问题内容: 如何以编程方式将SVG文件转换为PDF?(在生成PDF之前,我需要在某些方面进行更改,因此仅使用工具进行预转换就不够了。) 理想情况下,使用Java但Perl或PHP也可以。 显然,我基本上是在考虑使用Java的Apache FOP和Batik。但是,无论我搜索多长时间,都无法找到有关该操作方法的简单介绍。诸如SVGConverter之类的内容具有“为能够转换部分或全部GraphicC