使用PDFBox裁剪页面,并用白色填充矩形外部

问题描述

我正在开发一个自定义工具,并使用此代码切出页面

PDPage page = document.getPage(i-1);
PDRectangle cropBox = new PDRectangle();
cropBox.setLowerLeftX(llx);
cropBox.setLowerLeftY(lly);
cropBox.setUpperRightX(urx);
cropBox.setUpperRightY(ury);
page.setCropBox(cropBox);

PDPageContentStream contentStream = new PDPageContentStream(document,page,true,false,false);
contentStream.close();

在修整工具中,它看起来像这样。

enter image description here

但是当我打开pdf时,它看起来有所不同,我希望它看起来居中且边缘如第一张图片所示

enter image description here

解决方法

第二张图像正确。裁剪框定义了查看者应在页面画布上显示的框。如果您希望保留可见的页面尺寸,请将裁剪框保持不变,并用白色填充除内部矩形以外的所有框。

例如像这样:

PDDocument document = ... the document to manipulate ...;
PDRectangle box = ... the rectangle to remain visible ...;

for (PDPage page : document.getPages()) {
    PDRectangle cropBox = page.getCropBox();
    try (PDPageContentStream canvas = new PDPageContentStream(document,page,AppendMode.APPEND,false,true)) {
        canvas.setNonStrokingColor(1);
        canvas.addRect(cropBox.getLowerLeftX(),cropBox.getLowerLeftY(),cropBox.getWidth(),cropBox.getHeight());
        canvas.addRect(box.getLowerLeftX(),box.getLowerLeftY(),box.getWidth(),box.getHeight());
        canvas.fillEvenOdd();
    }
}

TrimContent测试testTrimCengage1


在您询问的评论中

您能拿出修剪过的一块并将其居中放在页面中间吗?

是的,通过相应地调整裁剪框:

for (PDPage page : document.getPages()) {
    PDRectangle cropBox = page.getCropBox();
    cropBox = centerBoxAroundBox(box,cropBox.getHeight());
    try (PDPageContentStream canvas = new PDPageContentStream(document,box.getHeight());
        canvas.fillEvenOdd();
    }
    page.setMediaBox(cropBox);
    page.setCropBox(cropBox);
}

TrimContent测试testTrimAndCenterCengage1

使用此辅助方法:

PDRectangle centerBoxAroundBox(PDRectangle box,float width,float height) {
    float horitontalMargins = (width - box.getWidth()) / 2;
    float verticalMargins = (height - box.getHeight()) / 2;
    return new PDRectangle(box.getLowerLeftX() - horitontalMargins,box.getLowerLeftY() - verticalMargins,width,height);
}

TrimContent辅助方法centerBoxAroundBox