How can I convert a PNG file to PDF using java?

前端 未结 4 981
眼角桃花
眼角桃花 2020-12-30 14:11

Are there any open source libraries that I can use?

4条回答
  •  遥遥无期
    2020-12-30 15:01

    An example which rotates the page, if landscape mode fits better

    /**
     * Converts arbitrary image file to PDF
     * http://stackoverflow.com/a/42937466/241986
     * @param imageFile contents of JPEG or PNG file
     * @param outputStream stream to write out pdf, always closed after this method execution.
     * @throws IOException when there' an actual exception or image is not valid
     */
    public static void imageToPdf(byte[] imageFile, OutputStream outputStream) throws IOException {
        try {
            Image image;
            try {
                image = Image.getInstance(imageFile);
            } catch (BadElementException bee) {
                throw new IOException(bee);
            }
    
            //See http://stackoverflow.com/questions/1373035/how-do-i-scale-one-rectangle-to-the-maximum-size-possible-within-another-rectang
            Rectangle A4 = PageSize.A4;
    
            float scalePortrait = Math.min(A4.getWidth() / image.getWidth(),
                    A4.getHeight() / image.getHeight());
    
            float scaleLandscape = Math.min(A4.getHeight() / image.getWidth(),
                    A4.getWidth() / image.getHeight());
    
            // We try to occupy as much space as possible
            // Sportrait = (w*scalePortrait) * (h*scalePortrait)
            // Slandscape = (w*scaleLandscape) * (h*scaleLandscape)
    
            // therefore the bigger area is where we have bigger scale
            boolean isLandscape = scaleLandscape > scalePortrait;
    
            float w;
            float h;
            if (isLandscape) {
                A4 = A4.rotate();
                w = image.getWidth() * scaleLandscape;
                h = image.getHeight() * scaleLandscape;
            } else {
                w = image.getWidth() * scalePortrait;
                h = image.getHeight() * scalePortrait;
            }
    
            Document document = new Document(A4, 10, 10, 10, 10);
    
            try {
                PdfWriter.getInstance(document, outputStream);
            } catch (DocumentException e) {
                throw new IOException(e);
            }
            document.open();
            try {
                image.scaleAbsolute(w, h);
                float posH = (A4.getHeight() - h) / 2;
                float posW = (A4.getWidth() - w) / 2;
    
                image.setAbsolutePosition(posW, posH);
                image.setBorder(Image.NO_BORDER);
                image.setBorderWidth(0);
    
                try {
                    document.newPage();
                    document.add(image);
                } catch (DocumentException de) {
                    throw new IOException(de);
                }
            } finally {
                document.close();
            }
        } finally {
            outputStream.close();
        }
    }
    

    Inside pom.xml, one of free iText forks, if you are not already using iText

    
        com.github.librepdf
        openpdf
        1.0.1
    
    

提交回复
热议问题