当前位置: 首页 > 面试题库 >

用PDFBox加水印

陶淳
2023-03-14
问题内容

我正在尝试使用PDFBox专门为PDF添加水印。我已经能够使图像显示在每个页面上,但是它失去了背景透明度,因为它看起来好像PDJpeg将其转换为JPG。也许有一种使用PDXObjectImage的方法。

到目前为止,这是我写的内容:

public static void watermarkPDF(PDDocument pdf) throws IOException
{
    // Load watermark
    BufferedImage buffered = ImageIO.read(new File("C:\\PDF_Test\\watermark.png"));
    PDJpeg watermark = new PDJpeg(pdf, buffered);

    // Loop through pages in PDF
    List pages = pdf.getDocumentCatalog().getAllPages();
    Iterator iter = pages.iterator();
    while(iter.hasNext())
    {
        PDPage page = (PDPage)iter.next();

        // Add watermark to individual page
        PDPageContentStream stream = new PDPageContentStream(pdf, page, true, false);
        stream.drawImage(watermark, 100, 0);
        stream.close();
    }

    try 
    {
        pdf.save("C:\\PDF_Test\\watermarktest.pdf");
    } 
    catch (COSVisitorException e) 
    {
        e.printStackTrace();
    }
}

问题答案:

更新的答案 (更好的版本,带有简单的水印方法,这要感谢下面的评论员和@okok的回答提供了输入)

如果您使用的是PDFBox
1.8.10或更高版本,则可以轻松地将水印添加到PDF文档中,从而更好地控制需要对哪些页面进行水印处理。假设您有一个包含水印图像的一页PDF文档,则可以按如下所示将此文档叠加在要加水印的文档上。

使用1.8.10的示例代码

import java.util.HashMap;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.Overlay;

public class TestPDF {
    public static void main(String[] args) throws Exception{
            PDDocument realDoc = PDDocument.load("originaldocument.pdf"); 
            //the above is the document you want to watermark

            //for all the pages, you can add overlay guide, indicating watermark the original pages with the watermark document.
            HashMap<Integer, String> overlayGuide = new HashMap<Integer, String>();
            for(int i=0; i<realDoc.getPageCount(); i++){
                overlayGuide.put(i+1, "watermark.pdf");
                //watermark.pdf is the document which is a one page PDF with your watermark image in it. Notice here that you can skip pages from being watermarked.
            }
            Overlay overlay = new Overlay();
            overlay.setInputPDF(realDoc);
            overlay.setOutputFile("final.pdf");
            overlay.setOverlayPosition(Overlay.Position.BACKGROUND);
            overlay.overlay(overlayGuide,false);
           //final.pdf will have the original PDF with watermarks.

使用PDFBox 2.0.0候选版本的示例

import java.io.File;
import java.util.HashMap;
import org.apache.pdfbox.multipdf.Overlay;
import org.apache.pdfbox.pdmodel.PDDocument;

public class TestPDF {

    public static void main(String[] args) throws Exception{        
        PDDocument realDoc = PDDocument.load(new File("originaldocument.pdf"));
        //the above is the document you want to watermark
        //for all the pages, you can add overlay guide, indicating watermark the original pages with the watermark document.

        HashMap<Integer, String> overlayGuide = new HashMap<Integer, String>();
        for(int i=0; i<realDoc.getNumberOfPages(); i++){
            overlayGuide.put(i+1, "watermark.pdf");
            //watermark.pdf is the document which is a one page PDF with your watermark image in it. 
            //Notice here, you can skip pages from being watermarked.
        }
        Overlay overlay = new Overlay();
        overlay.setInputPDF(realDoc);
        overlay.setOutputFile("final.pdf");
        overlay.setOverlayPosition(Overlay.Position.BACKGROUND);
        overlay.overlay(overlayGuide);      
    }
}

如果要将新的软件包org.apache.pdfbox.tools.OverlayPDF用于覆盖,则可以采用这种方法。(感谢下面的海报)

String[] overlayArgs = {"C:/Examples/foreground.pdf", "C:/Examples/background.pdf", "C:/Examples/resulting.pdf"};
OverlayPDF.main(overlayArgs);
System.out.println("Overlay finished.");

旧答案 低效方式,不建议使用。

好吧,OP问如何在PDFBox中做到这一点,第一个答案看起来像一个使用iText的示例。在PDFBox中创建水印非常简单。诀窍是,您应该具有带水印图像的空白PDF文档。然后,您要做的就是将此水印文档覆盖在要添加水印的文档上。

PDDocument watermarkDoc = PDDocument.load("watermark.pdf");
//Assuming your empty document with watermark image in it.

PDDocument realDoc = PDDocument.load("document-to-be-watermarked.pdf");
//Let's say this is your document that you want to watermark. For example sake, I am opening a new one, you would already have a reference to PDDocument if you are creating one

Overlay overlay = new Overlay();
overlay.overlay(realDoc,watermarkDoc);
watermarkDoc.save("document-now-watermarked.pdf");

警告:您应确保两个文档中的页数均匹配。否则,最终将得到一个文档,其页数与页数最少的文档相匹配。您可以操纵水印文档并复制页面以匹配您的文档。

希望这可以帮助。!



 类似资料:
  • 主要内容:在PDF文档中创建框, 示例本章将演示如何在PDF文档的页面中创建颜色框。 在PDF文档中创建框 使用类的方法在PDF页面中添加矩形框。 以下是在PDF文档的页面中创建矩形形状的步骤。 第2步:获取页面对象 需要使用类的方法检索要添加矩形的所需页面的对象。 对于此方法,传递要添加矩形的页面的索引。 第3步:准备内容流 使用类的对象来插入各种数据元素。 因此,需要将文档对象和页面对象传递给此类的构造函数,通过传递在前面的步骤中

  • 主要内容:将文本添加到现有的PDF文档,示例在前一章中,我们讨论了如何将页面添加到PDF文档。 在本章中,我们将讨论如何将文本添加到现有的PDF文档。 将文本添加到现有的PDF文档 可以使用PDFBox库将内容添加到文档,它提供一个名称为的类,其中包含在的页面中插入文本,图像和其他类型内容所需的方法。 以下是创建空白文档并将内容添加到其中的页面的步骤。 第1步:加载现有文档 使用类的方法加载现有文档。 因此,请实例化此类并加载所需的文档,如

  • 主要内容:加载现有的PDF文档,第1步:加载现有的PDF文档,示例在前面的例子中,已经学习了如何创建一个新文档并向其中添加页面。 本章将教您如何加载系统中已经存在的PDF文档,并对其进行一些操作。 加载现有的PDF文档 类的方法用于加载现有的PDF文档。 按照以下步骤加载现有的PDF文档。 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对象作为参数,因为这是一个静态方法,可以直接使用类名称调用它,如下所示。 第2步:执行

  • 主要内容:将页面添加到PDF文档,示例在前一章中,我们已经学习了如何创建PDF文档。 创建PDF文档后,我们需要添加页面。 现在来了解如何在PDF文档中添加页面。 将页面添加到PDF文档 可以通过实例化类并使用类的方法将其添加到PDF文档来创建空白页面。 以下是创建一个空文档并向其中添加页面的步骤。 第1步:创建空白文档 通过实例化类创建一个空的PDF文档,如下所示。 第2步:创建一个空白页面 类表示PDF文档中的一个页面,因此可以通

  • 我正在使用Microsoft打印到PDF打印机。我在PDPageable类@第74行中得到一个NPE,说我没有对此文档设置访问权限: 当检查时,该值确实为空。因此,我尝试手动设置一些没有用户名或密码的访问权限,仅使用打印权限: 但使用进行检查时,权限仍然为空。 注意:当我直接从操作系统使用Microsoft Print to PDF打印机打印时,证书将从打印的PDF文件中删除,因此该过程正常工作。

  • 问题内容: 我有一个网站,用户可以在其中上传图片… 上传图像后,我需要在图像上添加徽标(水印)。 我该怎么办? 而且重要的一点是,水印必须位于可以看到的角落,例如,我看到的网站会即时生成水印,并将水印放置在主图像的背景为“相同颜色”的任何位置,因此如果您明白我的意思,水印就会伸出来。 有人对此有很好的教程或文章吗?还是知道在php中需要找到水印位置的任何函数? 问题答案: :