gpt4 book ai didi

java - 使用 Apache Batik 将 SVG 转换为 PNG,然后使用 PDFBox 附加到 PDF,无需保存图像

转载 作者:行者123 更新时间:2023-11-30 05:57:45 28 4
gpt4 key购买 nike

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

目前我有一个 Web 表单,其中包含 SVG 图像及其可选部分。提交表单时,我采用 svg 的“html”部分,这意味着我保留类似 <svg bla bla> <path bla bla/></svg> 的内容。在一个字符串中,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 文件?

最佳答案

鉴于评论中的建议,我选择使用 ByteArrayOutputStream、ByteArrayInputStream、BufferedImage 和 LosslessFactory。它比保存慢一点(如果您在调试中进行它,似乎 BufferedImage 在创建图像之前先放假)。我发现使用的来源是:How to convert SVG into PNG on-the-flyPrint byte[] to pdf using pdfbox

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();

关于java - 使用 Apache Batik 将 SVG 转换为 PNG,然后使用 PDFBox 附加到 PDF,无需保存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52875145/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com