Drawing vector images on PDF with PDFBox

前端 未结 3 824
夕颜
夕颜 2021-02-13 20:41

I would like to draw a vector image on a PDF with Apache PDFBox.

This is the code I use to draw regular images

PDPage page = (PDPage) document.getDocumen         


        
3条回答
  •  天命终不由人
    2021-02-13 20:53

    The final working solution for me that loads an SVG file and overlays it on a PDF file (this renders the SVG in a 500x500 box at (0,0) coordinate which is bottom left of the PDF document):

    package com.example.svgadder;
    
    import java.io.*;
    import java.nio.*;
    
    import org.apache.pdfbox.pdmodel.*;
    import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
    import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
    
    import de.rototor.pdfbox.graphics2d.PdfBoxGraphics2D;
    
    import java.awt.geom.AffineTransform;
    
    import com.kitfox.svg.SVGDiagram;
    import com.kitfox.svg.SVGException;
    import com.kitfox.svg.SVGUniverse;
    
    public class App 
    {
        public static void main( String[] args ) throws Exception {
            
            App app = new App();
    
        }
    
        public App() throws Exception {
            
            // loading PDF and SVG files
    
            File pdfFile = new File("input.pdf");
            File svgFile = new File("input.svg");
    
            PDDocument doc = PDDocument.load(pdfFile);
            PDPage page = doc.getPage(0);
    
            SVGUniverse svgUniverse = new SVGUniverse();
            SVGDiagram diagram = svgUniverse.getDiagram(svgUniverse.loadSVG(f.toURL()));
            
            PdfBoxGraphics2D graphics = new PdfBoxGraphics2D(doc, 500, 500);
    
            try {
                diagram.render(graphics);
            } finally {
                graphics.dispose();
            }
    
            PDFormXObject xform = graphics.getXFormObject();
    
            try (PDPageContentStream contentWriter = new PDPageContentStream(doc, page, AppendMode.APPEND, false)) {
    
                AffineTransform transform = AffineTransform.getTranslateInstance(0, 0);
                xform.setMatrix(transform);
                contentWriter.drawForm(xform);
            }
    
            doc.save("res.pdf");
            doc.close();
        }
    }
    

    Please use svgSalamander from here: https://github.com/mgarin/svgSalamander

    Please use what Coemgenus suggested for scaling your final overlaid SVG. I tried the 2nd option and it works well.

    Nirmal

提交回复
热议问题