为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Apache Batik 将 SVG 转换为 PNG,然后使用 PDFBox 附加到

使用 Apache Batik 将 SVG 转换为 PNG,然后使用 PDFBox 附加到

POPMUISE 2021-11-24 19:05:41
因此,正如标题所说,我正在寻找一种使用 Apache Batik 将 SVG 转换为 PNG 的方法,然后使用 PDFBox 将此图像附加到 PDF 文件,而无需在任何地方实际创建 svg 和 png。目前我有一个 Web 表单,其中包含带有可选部分的 SVG 图像。提交表单时,我采用 svg 的“html”部分,这意味着我将类似<svg bla bla> <path bla bla/></svg>字符串的内容保留在 Spring 中,然后 Spring 会使用该字符串在给定文件夹中创建“.svg”文件,然后 Batik 在同一文件夹中创建一个 PNG 文件然后 PDFBox 将它附加到 PDF - 这很好用(下面的代码)。//Get the svg data from the Form and Create the svg fileString 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 PNGPNGTranscoder 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 pdfFile 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 文件的情况下在运行时执行此操作?
查看完整描述

2 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

鉴于评论中的建议,我选择使用 ByteArrayOutputStream、ByteArrayInputStream、BufferedImage 和 LosslessFactory。它比保存慢一点(如果你在调试中通过它,看起来 BufferedImage 在创建图像之前先去度假)。我发现使用的来源是:How to convert SVG into PNG on-the-fly and Print 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();


查看完整回答
反对 回复 2021-11-24
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

根据DVD提供的评论和链接,我也解决了这个问题。我只是想发布一个简单但完整的示例,供将来想要查看的任何人使用。


public class App {


    private static String OUTPUT_PATH = "D:\\so52875145\\output\\PdfWithPngImage.pdf";


    public static void main(String[] args) {


        try {

            // obtain the SVG source (hardcoded here, but the OP would obtain the String from form data)

            byte[] svgByteArray = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><polygon points=\"200,10 250,190 160,210\" style=\"fill:lime;stroke:purple;stroke-width:1\" /></svg>".getBytes();

            System.out.println("Converted svg to byte array...");


            // convert SVG into PNG image

            PNGTranscoder pngTranscoder = new PNGTranscoder();

            ByteArrayOutputStream os = new ByteArrayOutputStream();

            pngTranscoder.transcode(new TranscoderInput(new ByteArrayInputStream(svgByteArray)), new TranscoderOutput(os));

            System.out.println("Transcoded svg to png...");


            // create PDF, and add page to it

            PDDocument pdf = new PDDocument();

            pdf.addPage(new PDPage());


            // generate in-memory PDF image object, using the transcoded ByteArray stream

            BufferedImage bufferedImage = ImageIO.read( new ByteArrayInputStream(os.toByteArray()) );

            PDImageXObject pdImage = LosslessFactory.createFromImage(pdf, bufferedImage);

            System.out.println("Created PDF image object...");


            // write the in-memory PDF image object to the PDF page

            PDPageContentStream contents = new PDPageContentStream(pdf, pdf.getPage(0));

            contents.drawImage(pdImage, 0, 0);

            contents.close();

            System.out.println("Wrote PDF image object to PDF...");


            pdf.save(OUTPUT_PATH);

            pdf.close();

            System.out.println("Saved PDF to path=[" + OUTPUT_PATH + "]");

        }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

}



查看完整回答
反对 回复 2021-11-24
  • 2 回答
  • 0 关注
  • 429 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信