SVG в PNG с Apache Batik, затем прикрепите к PDF с PDFBox без сохранения изображений - PullRequest
0 голосов
/ 18 октября 2018

Так как в заголовке написано, что я ищу способ превратить SVG в PNG с помощью Apache Batik, а затем прикрепить это изображение к PDF-файлу с помощью PDFBox, фактически не создавая svg и png где-либо.

В настоящее время у меня естьвеб-форма с изображением SVG с возможностью ее выбора.Когда форма отправлена, я беру "html" часть svg, что означает, что я сохраняю что-то вроде <svg bla bla> <path bla bla/></svg> в строке, которую Spring затем использует для создания файла ".svg" в данной папке, затем Батик создает файл 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?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

На основе комментариев и ссылок, предоставленных 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();
        }
    }
}
0 голосов
/ 19 октября 2018

Учитывая предложение в комментариях, я выбрал использование ByteArrayOutputStream, ByteArrayInputStream, BufferedImage и LosslessFactory.Это немного медленнее, чем сохранение (если вы проходите через отладку, как кажется, BufferedImage уходит в отпуск перед созданием изображения).Источники, которые я нашел для использования: Как конвертировать SVG в PNG на лету и Печать байта [] в pdf с использованием 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();
...