2012-12-05 3 views
6

JPEG, BMP 유형의 이미지에서 PDF를 생성하려고하지만 이미지의 일부가 항상 잘릴 수 있습니다. 나는 기본 창 그림 Sunset.jpg 중 하나를 사용하고 있습니다.PDFBox - 이미지에서 PDF 생성 문제

import java.awt.image.BufferedImage; 
    import java.io.File; 
    import java.io.IOException; 

    import javax.imageio.ImageIO; 
    import javax.imageio.stream.FileImageInputStream; 
    import org.apache.pdfbox.exceptions.COSVisitorException; 
    import org.apache.pdfbox.io.RandomAccessFile; 
    import org.apache.pdfbox.pdmodel.PDDocument; 
    import org.apache.pdfbox.pdmodel.PDPage; 
    import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; 
    import org.apache.pdfbox.pdmodel.graphics.xobject.PDCcitt; 
    import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg; 
    import org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap; 
    import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage; 

    public class ImageToPDF 
    { 
     public void createPDFFromImage(String file, String image) throws IOException, COSVisitorException 
     { 
      PDDocument doc = null; 
      try 
      { 
       doc = new PDDocument(); 
       PDPage page = new PDPage(); 
       doc.addPage(page); 
       PDXObjectImage ximage = null; 
       if(image.toLowerCase().endsWith(".jpg") || image.toLowerCase().endsWith(".jpeg")) 
       {   
        BufferedImage awtImage = ImageIO.read(new File(image));    
      ximage = new PDJpeg(doc, awtImage, 0); 
       } 
       else if (image.toLowerCase().endsWith(".tif") || image.toLowerCase().endsWith(".tiff")) 
       { 
        ximage = new PDCcitt(doc, new RandomAccessFile(new File(image),"r")); 
       } 
       else 
       { 
         BufferedImage awtImage = new BufferedImage(1000, 800, BufferedImage.TYPE_INT_RGB);    
        awtImage = ImageIO.read(new FileImageInputStream(new File(image)));        
        ximage = new PDPixelMap(doc, awtImage); 
       } 
       System.out.println(" Width of the image.... "+ximage.getWidth()); 
       PDPageContentStream contentStream = new PDPageContentStream(doc, page);    
       contentStream.drawImage(ximage, 20, 20); 
       contentStream.close(); 
       doc.save(file); 
      } 
      finally 
      { 
       if(doc != null) 
       { 
        doc.close(); 
       } 
      } 
     } 

     public static void main(String[] args) 
     { 
      ImageToPDF app = new ImageToPDF(); 
      try 
      { 
       app.createPDFFromImage("C:\\test1.pdf", "C:\\Sunset.jpg");       
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 

}

내가 뭘 잘못 수정에 제발 도와주세요 : 아래

는 코드입니다.

+0

혹시에 대한 답변을 찾으셨습니까하여 여기서 질문 하나? 그렇다면 그들도 같은 문제에 직면하고 있기 때문에 공유하십시오. – Anuj

+0

최신 버전을 사용해 보셨습니까? jemp와 tempbox가 포함되어있어 모든 라이브러리 usch를 적절하게 사용 하시겠습니까 ?? – MemLeak

답변

0

이미지가 자르지 않도록 잘라 냈습니까?

contentStream.drawImage(ximage, 20, 20, croppedWidth, croppedHeight); 
0

로 아래의 drawImage 문을 수정하여보십시오 :

content.drawImage(ximage,0 /*or your preferred indent*/,(700-ximage.getHeight())); 
8

이 코드는, 그것은 당신에게 도움이 작동 할 수 있습니다.

public void createPDFFromImage(String pdfFile, 
     List<String> imgList,int x, int y, float scale) throws IOException, COSVisitorException { 
    // the document 
    PDDocument doc = null; 
    try { 
     doc = new PDDocument(); 
     Iterator iter = imgList.iterator(); 
     int imgIndex=0; 
     while(iter.hasNext()) { 
      PDPage page = new PDPage(); 
      doc.addPage(page); 

      BufferedImage tmp_image = ImageIO.read(new File(iter.next().toString())); 
      BufferedImage image = new BufferedImage(tmp_image.getWidth(), tmp_image.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);   
      image.createGraphics().drawRenderedImage(tmp_image, null); 

      PDXObjectImage ximage = new PDPixelMap(doc, image); 

      imgIndex++; 


      PDPageContentStream contentStream = new PDPageContentStream(
        doc, page,true,true); 

      contentStream.drawXObject(ximage, x, y, ximage.getWidth()*scale, ximage.getHeight()*scale); 

      contentStream.close(); 
     } 
     doc.save(pdfFile); 
    } finally { 
     if (doc != null) { 
      doc.close(); 
     } 
    } 
} 
+1

+10이 코드에서는 PDFBox의 코드 예제에 "contentStream.drawXObject"행을 포함 시켰습니다. –

+1

v2.0.0 : drawXObject - "@deprecated 대신 drawImage 또는 drawForm을 사용하십시오." –

-2

아래의 조각을 추가하고 시도하십시오 :

가져 오기 필요 :

import org.apache.pdfbox.pdmodel.common.PDRectangle; 

코드 추가 :

PDXObjectImage image = new PDJpeg(pdfDoc, filePath)); 

float w = image.getWidth(); 
float h = image.getHeight(); 

PDPage page = new PDPage(new PDRectangle (w,h)); 
관련 문제