2017-08-31 547 views
-3

我擁有現有/源PDF源文檔,並從中複製選定頁面並生成具有選定頁面的目標PDF。現有/源文檔中的每個頁面中不同分辨率被掃描,並且它的尺寸變化:使用iText7壓縮生成的PDF的最佳實踐

  1. 用4頁=> 175 kb的生成的文檔
  2. 用4頁=> 923 kb的生成的文檔(我想這是由於源文檔中每頁的掃描分辨率較高)

壓縮此頁面的最佳做法是什麼? 是否有任何壓縮/縮小最終PDF的代碼示例,其中包含不同分辨率的源文檔的複製頁面?

最親切的問候

+0

問題要求我們推薦或找到一本書,工具,軟件庫,教程或其他非本地資源,因爲它們傾向於吸引自以爲是的答案和垃圾郵件,所以不適合堆棧溢出。 – Lexi

+0

我需要使用iText進行壓縮的代碼示例...我試着寫禮貌地問:)) – dkkd

+1

這很棒,你在這裏遵循我們的不錯的政策!不幸的是,這個社區不喜歡什麼時候人們要求代碼示例,因爲它違背了我上面提到的離題指南。如果您向我們展示您嘗試實施的一些代碼,則我們更喜歡這些代碼,然後解釋哪些內容不適用於您需要幫助的內容。這更有可能讓你得到一些體面的迴應,甚至可能擺脫你收到的一些降價 – Lexi

回答

2

如果你只是將掃描到PDF文檔,是有意義的,由此產生的文件的大小上去,如果您使用的是高分辨率圖像。

請記住,iText是一個PDF庫。不是圖像操作庫。

你當然可以使用普通的老java來嘗試壓縮圖像。

public static void writeJPG(BufferedImage bufferedImage, OutputStream outputStream, float quality) throws IOException 
{ 
    Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("jpg"); 
    ImageWriter imageWriter = iterator.next(); 
    ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam(); 
    imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
    imageWriteParam.setCompressionQuality(quality); 
    ImageOutputStream imageOutputStream = new MemoryCacheImageOutputStream(outputStream); 
    imageWriter.setOutput(imageOutputStream); 
    IIOImage iioimage = new IIOImage(bufferedImage, null, null); 
    imageWriter.write(null, iioimage, imageWriteParam); 
    imageOutputStream.flush(); 
} 

但實際上,將掃描的圖像轉換成PDF使生活變得更加困難。想象一下在你之後必須處理該文件的人。他們打開它,看到文字,嘗試選擇它,並沒有任何反應。

Additionaly,你可能會創建PdfWriter實例時改變WriterProperties

PdfWriter writer = new PdfWriter(dest, 
    new WriterProperties().setFullCompressionMode(true)); 

完全壓縮模式將壓縮某些對象到對象流,它也將壓縮PDF的交叉引用表。由於文檔中的大多數對象都是圖像(已壓縮),壓縮對象不會產生太大影響,但如果頁面數量很多,則壓縮交叉引用表格可能會導致較小的PDF文件。

+0

布魯諾,謝謝你解釋如何全壓縮的作品。我的源PDF沒有很多頁/最大。 10頁,它包含通過另一個應用程序掃描的物理文檔,我無法改變生成PDF源文件的方式。布魯諾是正確的全壓縮,當我用它們時,我得到了非常小的縮小尺寸。另外,我考慮將您建議的常規Java壓縮,但最後我們將生成的文檔存儲在文件系統中,而我們不需要壓縮圖像。再次感謝您的答覆。 – dkkd

+0

你在混淆布魯諾和喬里斯。 :) –

+0

@Amedee:我希望不要混淆太多:)) – dkkd