我正在使用pdfbox并排连接两个pdf。我正在使用以下代码:
PDDocument outDoc = new PDDocument();
int maxPages = targetDoc.getNumberOfPages();
if(sourceDoc.getNumberOfPages()>targetDoc.getNumberOfPages()){
maxPages = sourceDoc.getNumberOfPages();
}
PDPage sourceIndexPage;
PDPage targetIndexPage;
PDRectangle pdf1Frame;
PDRectangle pdf2Frame;
PDRectangle outPdfFrame;
COSDictionary dict;
PDPage outPdfPage;
LayerUtility layerUtility;
PDFormXObject sourceFormPDF;
PDFormXObject targetFormPDF;
AffineTransform afLeft;
AffineTransform afRight;
for(int indexPage =0; indexPage < maxPages; indexPage++) {
// Create output PDF frame
try {
sourceIndexPage = sourceDoc.getPage(indexPage);
}catch(IndexOutOfBoundsException error){
sourceDoc.addPage(new PDPage());
sourceIndexPage = targetDoc.getPage(indexPage); }
try {
targetIndexPage = targetDoc.getPage(indexPage);
}catch (IndexOutOfBoundsException error){
targetDoc.addPage(new PDPage());
targetIndexPage = targetDoc.getPage(indexPage);
}
sourceIndexPage.setRotation(0);
targetIndexPage.setRotation(0);
pdf1Frame = sourceIndexPage.getCropBox();
pdf2Frame = targetIndexPage.getCropBox();
outPdfFrame = new PDRectangle(pdf1Frame.getWidth() + pdf2Frame.getWidth(),
Math.max(pdf1Frame.getHeight(), pdf2Frame.getHeight()));
// Create output page with calculated frame and add it to the document
dict = new COSDictionary();
dict.setItem(COSName.TYPE, COSName.PAGE);
dict.setItem(COSName.MEDIA_BOX, outPdfFrame);
dict.setItem(COSName.CROP_BOX, outPdfFrame);
dict.setItem(COSName.ART_BOX, outPdfFrame);
outPdfPage = new PDPage(dict);
outDoc.addPage(outPdfPage);
// Source PDF pages has to be imported as form XObjects to be able to insert them at a specific point in the output page
// pageNumber
layerUtility = new LayerUtility(outDoc);
sourceFormPDF = layerUtility.importPageAsForm(sourceDoc, indexPage);
targetFormPDF = layerUtility.importPageAsForm(targetDoc, indexPage);
// Add form objects to output page
afLeft = new AffineTransform();
layerUtility.appendFormAsLayer(outPdfPage, sourceFormPDF, afLeft, "left "+ indexPage);
afRight = AffineTransform.getTranslateInstance(pdf1Frame.getWidth(), 0.0);
layerUtility.appendFormAsLayer(outPdfPage, targetFormPDF, afRight, "right"+ indexPage);
}
outDoc.save("oudDoc.pdf");
我的问题是,对于某些文档,outdoc的大小太大。我期望它是暗淡的源文档+暗淡的目标文档,但实际上它是10倍,20倍以上。
查看文档结构内部,我注意到我正在重复原始PDF中分离的公共资源。有没有办法压缩/优化我的代码以减少磁盘空间?
1条答案
按热度按时间chy5wohz1#
我们通过使用ghostscript对生成的pdf进行后处理来解决这个问题