PDFBox - 覆盖正在旋转的内容
PDFBox - overlay content being rotated
我有一个 pdf(支持 pdf),其中有一个页面已旋转(旋转为横向)。
我有一个覆盖 pdf,其页面尺寸与横向页面相同,但没有旋转。
应用叠加层时,叠加层将呈现为垂直于旋转的页面。
我试过设置单个重叠 pdf 页面的旋转,但似乎没有效果。
PDDocument baseDocument = PDDocument.load(new File("examples/test/base.pdf"));;
PDDocument overlayDocument = PDDocument.load(new File("examples/test/overlay.pdf"));
Iterator<PDPage> baseDocumentIterator = baseDocument.getPages().iterator();
Iterator<PDPage> overlayIterator = overlayDocument.getPages().iterator();
while(baseDocumentIterator.hasNext() && overlayIterator.hasNext()) {
PDPage backing = baseDocumentIterator.next();
PDPage foreground = overlayIterator.next();
if(backing.getRotation()!= foreground.getRotation())
{
foreground.setRotation(-backing.getRotation()); //doesn't seem to do antyhing
}
}
PDAcroForm acroForm = baseDocument.getDocumentCatalog().getAcroForm();
if (acroForm != null) {
acroForm.flatten();
}
Overlay overlay = new Overlay();
overlay.setOverlayPosition(Overlay.Position.FOREGROUND);
overlay.setInputPDF(baseDocument);
overlay.setAllPagesOverlayPDF(overlayDocument);
Map<Integer, String> ovmap = new HashMap<Integer, String>();
overlay.overlay(ovmap);
AccessPermission ap = new AccessPermission();
ap.setCanExtractContent(false);
ap.setCanFillInForm(false);
ap.setCanModify(false);
ap.setReadOnly();
ap.setCanModifyAnnotations(false);
StandardProtectionPolicy standardPP = new StandardProtectionPolicy("", "", ap);
standardPP.setEncryptionKeyLength(128);
baseDocument.protect(standardPP);
baseDocument.save("examples/test/output.pdf");
baseDocument.close();
overlayDocument.close();
有什么办法可以用pdfbox处理这种情况吗?
谢谢
您可能使用的是 2.0.17 之前的 pdfbox 版本,因为在此版本中,导致所述行为的错误是 fixed:
[PDFBOX-4596] - Overlays with /Rotate value appear rotated in result file
对于 2.0.17 及更高版本,您的代码生成:
这是 PDFBOX 中的错误。覆盖忽略旋转的页面。您可以在此处查看问题 PDFBOX-4596。自2019-09-20发布2.0.17版本后已解决
另请注意,自版本 2.0.10 起,您可以覆盖 Overlay.calculateAffineTransform
以主要控制叠加层的应用方式(默认为以目的地为中心)
我有一个 pdf(支持 pdf),其中有一个页面已旋转(旋转为横向)。
我有一个覆盖 pdf,其页面尺寸与横向页面相同,但没有旋转。
应用叠加层时,叠加层将呈现为垂直于旋转的页面。
我试过设置单个重叠 pdf 页面的旋转,但似乎没有效果。
PDDocument baseDocument = PDDocument.load(new File("examples/test/base.pdf"));;
PDDocument overlayDocument = PDDocument.load(new File("examples/test/overlay.pdf"));
Iterator<PDPage> baseDocumentIterator = baseDocument.getPages().iterator();
Iterator<PDPage> overlayIterator = overlayDocument.getPages().iterator();
while(baseDocumentIterator.hasNext() && overlayIterator.hasNext()) {
PDPage backing = baseDocumentIterator.next();
PDPage foreground = overlayIterator.next();
if(backing.getRotation()!= foreground.getRotation())
{
foreground.setRotation(-backing.getRotation()); //doesn't seem to do antyhing
}
}
PDAcroForm acroForm = baseDocument.getDocumentCatalog().getAcroForm();
if (acroForm != null) {
acroForm.flatten();
}
Overlay overlay = new Overlay();
overlay.setOverlayPosition(Overlay.Position.FOREGROUND);
overlay.setInputPDF(baseDocument);
overlay.setAllPagesOverlayPDF(overlayDocument);
Map<Integer, String> ovmap = new HashMap<Integer, String>();
overlay.overlay(ovmap);
AccessPermission ap = new AccessPermission();
ap.setCanExtractContent(false);
ap.setCanFillInForm(false);
ap.setCanModify(false);
ap.setReadOnly();
ap.setCanModifyAnnotations(false);
StandardProtectionPolicy standardPP = new StandardProtectionPolicy("", "", ap);
standardPP.setEncryptionKeyLength(128);
baseDocument.protect(standardPP);
baseDocument.save("examples/test/output.pdf");
baseDocument.close();
overlayDocument.close();
有什么办法可以用pdfbox处理这种情况吗? 谢谢
您可能使用的是 2.0.17 之前的 pdfbox 版本,因为在此版本中,导致所述行为的错误是 fixed:
[PDFBOX-4596] - Overlays with /Rotate value appear rotated in result file
对于 2.0.17 及更高版本,您的代码生成:
这是 PDFBOX 中的错误。覆盖忽略旋转的页面。您可以在此处查看问题 PDFBOX-4596。自2019-09-20发布2.0.17版本后已解决
另请注意,自版本 2.0.10 起,您可以覆盖 Overlay.calculateAffineTransform
以主要控制叠加层的应用方式(默认为以目的地为中心)