2017-09-22 160 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页的事实并没有太大的区别:文件大小的大部分将被资源占用,没有它,页面将无法正确显示。

解决方案将是一个工作流程,可在复制页面期间或之后优化文档。这可以将图像转换为等效的较小的颜色空间或字体子集,以便您只携带所需的字形。这两种技术都可以大大减小文件的大小(当然,这完全取决于源文件本身的构建方式)。

相关问题