【问题标题】:Crop page with PDFBox and fill outside of rectangle with white用 PDFBox 裁剪页面并用白色填充矩形外部
【发布时间】:2020-08-19 12:28:11
【问题描述】:

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

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();

在我修剪时在工具中它看起来像这样。

但是当我打开 pdf 时,它看起来不一样,我希望它看起来居中并且边缘与第一张图片一样

【问题讨论】:

  • 第二张图是正确的。裁剪框定义页面上查看者应显示的框。如果您希望保留可见的页面尺寸,请保持裁剪框不变,并将除内部矩形之外的所有内容都填充为白色。
  • 你能写一个例子吗?
  • 在下面查看我的答案。

标签: java pdf pdfbox crop


【解决方案1】:

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

例如像这样:

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.getWidth(), cropBox.getHeight());
    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();
    }
    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)

【讨论】:

  • 你能把剪下来的那块放在页面中间吗?
  • @PereZix 我刚刚相应地添加到我的答案中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多