2017-09-22 183 views
0

我使用此方法從原始PDF複製和縮放頁碼,並將它們生成爲僅包含從原始PDF中選定和縮放的頁面的PDF。如何使用iText7減小生成PDF的大小

private static void addScaledPage(PdfDocument pdf, PdfDocument srcDoc, String pageNumber) throws IOException { 
     PdfPage page = pdf.addNewPage(PageSize.A4); 
     PdfCanvas canvas = new PdfCanvas(page); 
     AffineTransform transformationMatrix = AffineTransform.getScaleInstance(0.86, 0.86); 
     canvas.concatMatrix(transformationMatrix); 
     PdfFormXObject pageCopy = srcDoc.getPage(Integer.valueOf(pageNumber)).copyAsFormXObject(pdf); 
     canvas.addXObject(pageCopy, 50, 30); 
    } 

此代碼工作正常,但是當我嘗試採取從原始PDF 3頁具有140頁,約小問題發生。 10 MB大小=>具有3個選定頁面的生成的PDF也具有約。 10 MB。 此外,當我嘗試從原始文檔複製3頁或10頁時,我總是獲得相同尺寸的生成PDF =>它似乎是參考文獻從源複製PDF

我希望能給我一些建議,我在執行中做錯了什麼?或者其他一些建議?

最親切的問候,

+0

沒有看pdf源代碼,我不能肯定地說,但PDF允許您重新使用對象,並將一個頁面複製爲formXObject也將複製顯示該頁面所需的所有資源。如果您正在複製相同的頁面,並且原始文檔重新使用此頁面的資源,則可以解釋觀察到的行爲。但是對於單個頁面,10MB是相當多的:p –

+0

解決這個問題的任何想法......是否有可能將屬於iText7庫的getPage()或copyPagesTo()方法從原始源PDF文檔中獲取所有資源並複製它到生成的PDF? – dkkd

回答

0

這取決於嵌入在文檔中的資源很多。如果在複製的頁面上使用使用CMYK顏色的大圖像或CJK字形的字體(這些資源中的任何一個的大小可能容易爲幾MB),那麼整個資源將被複制到您要創建的PDF中。您只複製三個140頁的事實並沒有太大的區別:文件大小的大部分將被資源佔用,沒有它,頁面將無法正確顯示。

解決方案將是一個工作流程,可在複製頁面期間或之後優化文檔。這可以將圖像轉換爲等效的較小的顏色空間或字體子集,以便您只攜帶所需的字形。這兩種技術都可以大大減小文件的大小(當然,這完全取決於源文件本身的構建方式)。

相關問題