2011-12-02 163 views

回答

6

itext可以帮助你。 你并没有真正将png转换为pdf,而是使用png创建了一个pdf。 简单的例子:

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(); 
2

其旋转的页面,如果横向模式下,如果你是不是已经利用iText

更适合的

/** 
* 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(); 
    } 
} 

里面的pom.xml,免费iText的叉一个,一个例子

<dependency> 
    <groupId>com.github.librepdf</groupId> 
    <artifactId>openpdf</artifactId> 
    <version>1.0.1</version> 
</dependency> 
相关问题