2012-07-10 27 views
8

Tôi đang cố gắng chèn hình ảnh bên trong PDF nhưng chất lượng làm cho hình ảnh không thể đọc được. Làm cách nào để cải thiện chất lượng của tài liệu PDF cuối cùng?Hình ảnh mờ của PDFBox khi được chèn vào pdf trong Java

Tôi đã thử các thư viện giấy phép GPL miễn phí khác và tôi nghĩ rằng pdfbox là tốt nhất, vì vậy tôi muốn có thể sử dụng pdfbox.

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

import javax.imageio.ImageIO; 

import org.apache.pdfbox.exceptions.COSVisitorException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; 
import org.apache.pdfbox.pdmodel.font.PDFont; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage; 


public class pdfBoxTest { 


    public static void WritteBufferedImageToPDF(BufferedImage buff) 
    { 

     PDDocument doc = null; 
     PDPage page = null; 
     PDXObjectImage ximage = null; 
     try { 
      doc = new PDDocument(); 
      page = new PDPage(); 
      doc.addPage(page); 

      ximage = new PDJpeg(doc, buff, 1.0f); 

      PDPageContentStream content = new PDPageContentStream(doc, page); 


      content.drawImage(ximage, 0, 0); 
      content.close(); 
      doc.save("C:/Users/crusader/Desktop/Hello World.pdf"); 
      doc.close(); 

     } 
     catch (IOException ie){ 
      ie.printStackTrace(); 
      //handle exception 
     } 
     //save and close 
catch (COSVisitorException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
    public static void main(String []args) 
    { 
     BufferedImage buff= null; 

     try{ 

      buff = ImageIO.read(new File("C:/Users/crusader/Desktop","tests.jpg")); 

     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 

     System.out.println(buff.getWidth()); 
     System.out.println(buff.getHeight()); 
     pdfBoxTest.WritteBufferedImageToPDF(buff); 
    } 
} 
+0

Vấn đề bắt nguồn từ PDFBox chỉ có khả năng sử dụng JPEG là định dạng hình ảnh cho hình ảnh trong tài liệu, mà là một định dạng lossy. Tôi chưa tìm được giải pháp phù hợp. – iddo

+1

@iddo: thử PDPixelMap trong phiên bản mới nhất – Gilead

+0

@Crusader: Tôi đã thử mã của bạn và hoạt động tốt, nhưng tôi chỉ nhận được một nửa nội dung trang (chiều rộng khôn ngoan) trong tài liệu pdf.Can u hãy giúp tôi với điều đó –

Trả lời

5

Tôi biết một thủ thuật có thể giúp bạn nâng cao chất lượng trong một số kịch bản với PDFBOX, mà là để chia tỷ lệ ảnh (Tôi biết nó không phải là một giải pháp rất thông minh, tăng việc sử dụng CPU, kích thước tập tin ... nhưng nó hoạt động).

public class PdfBoxTest { 

    public static void WritteBufferedImageToPDF(BufferedImage buff, int width, int height) 
    { 

     PDDocument doc = null; 
     PDPage page = null; 
     PDXObjectImage ximage = null; 
     try { 
      doc = new PDDocument(); 
      page = new PDPage(); 
      doc.addPage(page); 

      ximage = new PDJpeg(doc, buff, 1.0f); 

      PDPageContentStream content = new PDPageContentStream(doc, page); 

      content.drawXObject(ximage, 0, 0, width, height); 
      content.close(); 
      doc.save("C:/Users/crusader/DesktopHello World.pdf"); 
      doc.close(); 

     } 
     catch (IOException ie){ 
      ie.printStackTrace(); 
      //handle exception 
     } 
     //save and close 
     catch (COSVisitorException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    private static final int SCALE_FACTOR = 3;//increases file size and quality 

    public static void main(String []args) 
    { 
     BufferedImage buff= null; 
     BufferedImage resized = null; 
     try{ 
      buff = ImageIO.read(new File("C:/Users/crusader/Desktop","tests.jpg")); 
      resized = new BufferedImage(buff.getWidth()*SCALE_FACTOR, buff.getHeight()*SCALE_FACTOR, buff.getType()); 
      Graphics2D g = resized.createGraphics(); 
      g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
      g.drawImage(buff, 0, 0, resized.getWidth(), resized.getHeight(), 0, 0, buff.getWidth(), buff.getHeight(), null); 
      g.dispose();   
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 

     System.out.println(buff.getWidth()); 
     System.out.println(buff.getHeight()); 

     PdfBoxTest.WritteBufferedImageToPDF(resized, buff.getWidth(), buff.getHeight()); 
    } 
} 

* Xin vui lòng cho tôi biết nếu điều này đã phần nào hữu ích

+0

Tôi đã thử mã của bạn và hoạt động tốt, nhưng tôi chỉ nhận được một nửa nội dung trang (chiều rộng khôn ngoan) trong tài liệu pdf.Can u hãy giúp tôi với điều đó –

+0

Nhân chiều rộng và chiều cao với 0,5f trong content.drawXObject() gọi điện. –

Các vấn đề liên quan