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

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

Are there any open source libraries that I can use?

相关标签:
4条回答
  • 2020-12-30 14:45

    for reading javax.imageio.ImageIO for writing pdf itext: http://itextpdf.com

    0 讨论(0)
  • 2020-12-30 14:59

    Use iText to convert jpg/png/gif to pdf with following code. It's work perfect.

    import java.io.FileOutputStream;
    //com.lowagie...   old version
    //com.itextpdf...  recent version
    import com.itextpdf.text.Document;
    import com.itextpdf.text.pdf.PdfWriter;
    import com.itextpdf.text.Image;
    
    public class ImageToPDF {
      public static void main(String ... args) {
        Document document = new Document();
        String input = "c:/temp/capture.png"; // .gif and .jpg are ok too!
        String output = "c:/temp/capture.pdf";
        try {
          FileOutputStream fos = new FileOutputStream(output);
          PdfWriter writer = PdfWriter.getInstance(document, fos);
          writer.open();
          document.open();
          document.add(Image.getInstance(input));
          document.close();
          writer.close();
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
    
    0 讨论(0)
  • 2020-12-30 15:00

    itext may help you. you don't really convert a png to pdf but create a pdf with a png in it. simple example:

    Document document = new Document(PageSize.A4, 20, 20, 20, 20);
    PdfWriter.getInstance(document, new FileOutputStream("C:/test.pdf"));
    document.open();
    Image image = Image.getInstance(getClass().getResource("/logo.png"));
    document.add(image);
    document.close();
    
    0 讨论(0)
  • 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

    <dependency>
        <groupId>com.github.librepdf</groupId>
        <artifactId>openpdf</artifactId>
        <version>1.0.1</version>
    </dependency>
    
    0 讨论(0)
提交回复
热议问题