2012-07-10 48 views
8

PDF内に画像を挿入しようとしていますが、画像が読めなくなります。どのようにして最終的なPDF文書の品質を向上させることができますか?PDFBoxにPDFで挿入するとぼやけた画像が表示される

私は他の無料の非GPLライセンスライブラリを試しました。私はpdfboxが最高だと思うので、私は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

問題はPDFBoxが唯一の非可逆形式でドキュメントに記載されている画像のための画像フォーマットとしてJPEGを使用することができることから生じて何とか役に立っている場合は私に知らせてください。 まだ適切な解決策が見つかりませんでした。 – iddo

+1

@iddo:最新版のPDPixelMapを試してください – Gilead

+0

@Crusader:私はあなたのコードとそのうまくいったことを試しましたが、私はpdf document.Canのページ内容(幅が広い)の半分しか得ていません。 –

答えて

5

私は(私はそれが非常にスマートな解決策ではないと知っているあなたは、画像を拡大縮小することであるPDFBOX、といくつかのシナリオで品質を向上させることができますトリックを知っているが、CPUの使用、ファイルサイズが大きくなり...それは動作します)。

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

*、これは

+0

私はあなたのコードとそのうまくいったことを試しましたが、私はpdf document.Canのページの内容(幅が広い)の半分しか得ていません。 –

+0

content.drawXObjectの0.5fで幅と高さを掛けてください()呼び出し。 –

関連する問題