pdfbox并排连接两个pdf,优化磁盘空间

zf2sa74q  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(272)

我正在使用pdfbox并排连接两个pdf。我正在使用以下代码:

  1. PDDocument outDoc = new PDDocument();
  2. int maxPages = targetDoc.getNumberOfPages();
  3. if(sourceDoc.getNumberOfPages()>targetDoc.getNumberOfPages()){
  4. maxPages = sourceDoc.getNumberOfPages();
  5. }
  6. PDPage sourceIndexPage;
  7. PDPage targetIndexPage;
  8. PDRectangle pdf1Frame;
  9. PDRectangle pdf2Frame;
  10. PDRectangle outPdfFrame;
  11. COSDictionary dict;
  12. PDPage outPdfPage;
  13. LayerUtility layerUtility;
  14. PDFormXObject sourceFormPDF;
  15. PDFormXObject targetFormPDF;
  16. AffineTransform afLeft;
  17. AffineTransform afRight;
  18. for(int indexPage =0; indexPage < maxPages; indexPage++) {
  19. // Create output PDF frame
  20. try {
  21. sourceIndexPage = sourceDoc.getPage(indexPage);
  22. }catch(IndexOutOfBoundsException error){
  23. sourceDoc.addPage(new PDPage());
  24. sourceIndexPage = targetDoc.getPage(indexPage); }
  25. try {
  26. targetIndexPage = targetDoc.getPage(indexPage);
  27. }catch (IndexOutOfBoundsException error){
  28. targetDoc.addPage(new PDPage());
  29. targetIndexPage = targetDoc.getPage(indexPage);
  30. }
  31. sourceIndexPage.setRotation(0);
  32. targetIndexPage.setRotation(0);
  33. pdf1Frame = sourceIndexPage.getCropBox();
  34. pdf2Frame = targetIndexPage.getCropBox();
  35. outPdfFrame = new PDRectangle(pdf1Frame.getWidth() + pdf2Frame.getWidth(),
  36. Math.max(pdf1Frame.getHeight(), pdf2Frame.getHeight()));
  37. // Create output page with calculated frame and add it to the document
  38. dict = new COSDictionary();
  39. dict.setItem(COSName.TYPE, COSName.PAGE);
  40. dict.setItem(COSName.MEDIA_BOX, outPdfFrame);
  41. dict.setItem(COSName.CROP_BOX, outPdfFrame);
  42. dict.setItem(COSName.ART_BOX, outPdfFrame);
  43. outPdfPage = new PDPage(dict);
  44. outDoc.addPage(outPdfPage);
  45. // Source PDF pages has to be imported as form XObjects to be able to insert them at a specific point in the output page
  46. // pageNumber
  47. layerUtility = new LayerUtility(outDoc);
  48. sourceFormPDF = layerUtility.importPageAsForm(sourceDoc, indexPage);
  49. targetFormPDF = layerUtility.importPageAsForm(targetDoc, indexPage);
  50. // Add form objects to output page
  51. afLeft = new AffineTransform();
  52. layerUtility.appendFormAsLayer(outPdfPage, sourceFormPDF, afLeft, "left "+ indexPage);
  53. afRight = AffineTransform.getTranslateInstance(pdf1Frame.getWidth(), 0.0);
  54. layerUtility.appendFormAsLayer(outPdfPage, targetFormPDF, afRight, "right"+ indexPage);
  55. }
  56. outDoc.save("oudDoc.pdf");

我的问题是,对于某些文档,outdoc的大小太大。我期望它是暗淡的源文档+暗淡的目标文档,但实际上它是10倍,20倍以上。
查看文档结构内部,我注意到我正在重复原始PDF中分离的公共资源。有没有办法压缩/优化我的代码以减少磁盘空间?

chy5wohz

chy5wohz1#

我们通过使用ghostscript对生成的pdf进行后处理来解决这个问题

相关问题