【问题标题】:How to extend the page size of a PDF to add a watermark?如何扩展 PDF 的页面大小以添加水印?
【发布时间】:2015-06-28 19:57:42
【问题描述】:

我的网络应用程序签署 PDF 文档。我想让用户下载原始 PDF 文档(未签名),但在 pdf 文档的左边距添加图像和签名者。

我在另一个 Web 应用程序中看到了这个想法,我也想这样做。当然我想用 itext 库来做。

我附上了两张图片,原始 PDF 文档(未签名)和修改后的 PDF 文档。

【问题讨论】:

  • 如果我认为文档不仅有水印,而且页面大小也发生了变化,那我是对的吗?就好像在左边增加了额外的空间。它是否正确?水印在这里解释:How to watermark PDFs using text or images?。答案也有法语版本:Comment créer un filigrane transparent en PDF?
  • 是的,页面大小已经改变。我用adobe reader看过。第一个文档页面大小为 215,9 x 279,4,第二个文档页面大小为 210 x 297 (mm)
  • 好的,这很容易实现,但我目前正在 Adob​​e 总部参加有关 ISO-32000-2 的 ISO 会议,所以您需要给我一些时间。
  • 当然了,请您慢慢来
  • 我之前告诉过你,尺寸变了,这是真的,但它变了,因为原始文档大小不是210 x 297。原始大小的文档是210 x 297,然后是新的文档大小不变。然后这让我觉得原始文档的内容被缩放并向右平移,在页面左侧留下一个垂直空间用于包含水印。

标签: java pdf itext watermark


【解决方案1】:

首先:在对文档进行数字签名之前更改文档很重要。一旦数字签名,这些更改将破坏签名。

我将把这个问题分成两部分,我将跳过关于实际水印的部分,因为这已经在这里解释了:How to watermark PDFs using text or images?

这个问题不是那个问题的重复,因为需要在右侧添加额外的边距。

查看primes.pdf 文档。这是我们将在AddExtraMargin 示例中使用的源文件,结果如下:primes_extra_margin.pdf。如您所见,每页的左侧都添加了半英寸的边距。

它是这样完成的:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    int n = reader.getNumberOfPages();
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    // properties
    PdfContentByte over;
    PdfDictionary pageDict;
    PdfArray mediabox;
    float llx, lly, ury;
    // loop over every page
    for (int i = 1; i <= n; i++) {
        pageDict = reader.getPageN(i);
        mediabox = pageDict.getAsArray(PdfName.MEDIABOX);
        llx = mediabox.getAsNumber(0).floatValue();
        lly = mediabox.getAsNumber(1).floatValue();
        ury = mediabox.getAsNumber(3).floatValue();
        mediabox.set(0, new PdfNumber(llx - 36));
        over = stamper.getOverContent(i);
        over.saveState();
        over.setColorFill(new GrayColor(0.5f));
        over.rectangle(llx - 36, lly, 36, ury - llx);
        over.fill();
        over.restoreState();
    }
    stamper.close();
    reader.close();
}

我们通过getPageN() 方法得到的PdfDictionary 称为页面字典。它包含有关 PDF 中特定页面的大量信息。我们只看一个条目:/MediaBox。这只是一个概念证明。如果您想编写更健壮的应用程序,您还应该查看/CropBox/Rotate 条目。顺便说一句,我知道这些条目在 primes.pdf 中不存在,所以我在这里省略了它们。

页面的媒体框是一个数组,有四个值,代表一个由其左下角和右上角的坐标定义的矩形(通常,我将它们称为@987654332 @、llyurxury)。

在我的代码示例中,我通过减去 36 个用户单位来更改 llx 的值。如果您比较两个 PDF 的页面大小,您会发现我们增加了半英寸。

我们还使用这些坐标来绘制一个覆盖额外半英寸的矩形。现在切换到其他水印示例,了解如何向每个页面添加文本或其他内容。

更新:

如果您需要缩小现有页面,请阅读Fix the orientation of a PDF in order to scale it

【讨论】:

  • 非常感谢!!我确信有了所有这些信息,我将实现我的目标。
猜你喜欢
  • 2018-09-30
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多