如何使用PDFBox识别PDF水印并删除它

问题描述 投票:0回答:2

我正在尝试使用 Apache PDFBox 库从 PDF 文件中提取除水印文本之外的文本,所以我想先删除水印,剩下的就是我想要的。但不幸的是,PDmetadata 和 PDXObject 都无法识别水印,任何我们将不胜感激。我在下面找到了一些代码。

        // Open PDF document
    PDDocument document = null;
    try {
        document = PDDocument.load(PATH_TO_YOUR_DOCUMENT);
    } catch (IOException e) {
        e.printStackTrace();
    }
    // Get all pages and loop through them
    List pages = document.getDocumentCatalog().getAllPages();
    Iterator iter = pages.iterator();
    while( iter.hasNext() ) {
        PDPage page = (PDPage)iter.next();
        PDResources resources = page.getResources();            
        Map images = null;
        // Get all Images on page
        try {
            images = resources.getImages();//How to specify watermark instead of images??
        } catch (IOException e) {
            e.printStackTrace();
        }
        if( images != null ) {
            // Check all images for metadata
            Iterator imageIter = images.keySet().iterator();
            while( imageIter.hasNext() ) {
                String key = (String)imageIter.next();
                PDXObjectImage image = (PDXObjectImage)images.get( key );
                PDMetadata metadata = image.getMetadata();
                System.out.println("Found a image: Analyzing for Metadata");
                if (metadata == null) {
                    System.out.println("No Metadata found for this image.");
                } else {
                    InputStream xmlInputStream = null;
                    try {
                        xmlInputStream = metadata.createInputStream();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        System.out.println("--------------------------------------------------------------------------------");
                        String mystring = convertStreamToString(xmlInputStream);
                        System.out.println(mystring);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                // Export the images
                String name = getUniqueFileName( key, image.getSuffix() );
                    System.out.println( "Writing image:" + name );
                    try {
                        image.write2file( name );
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        //e.printStackTrace();
                }
                System.out.println("--------------------------------------------------------------------------------");
            }
        }
    }
metadata pdfbox watermark
2个回答
3
投票

与您的假设相反,PDF 中没有像“显式水印对象”这样的东西来识别通用 PDF 中的水印。 可以通过多种方式将水印应用到 PDF 页面;每个 PDF 创建库或应用程序都有自己的添加水印的方式,有些甚至提供多种方式。

水印可以

在内容早期绘制的任何内容(位图图形、矢量图形、文本等),因此形成绘制其余内容的背景;
  1. 在内容中后期绘制的具有透明度的任何内容(位图图形、矢量图形、文本等),形成透明叠加层;
  2. 在水印注释的内容流中绘制的任何内容(位图图形、矢量图形、文本等),
  3. 应用于表示应以固定大小和位置打印在页面上的图形,无论尺寸如何打印页面的尺寸
  4. (参见 PDF 规范 ISO 32000-1 第 12.5.6.22 节)。
  5. 有时甚至使用混合形式,请看一下
这个答案

作为示例,在底部您会发现在图形上方但文本下方绘制的“水印”(以便于阅读)。 后一个选择(水印注释)显然

很容易删除,但它实际上也是最不常用的选择,很可能是

因为它很容易删除;应用水印的人通常不希望他们的水印丢失。此外,PDF 查看器有时会错误地处理注释,并且复制页面内容的代码通常会忽略注释。 如果您不处理通用

文档,而是处理

特定类型文档(所有生成方式都相似),则水印在其中应用的方式可能会被识别,并且提取例程可能会被识别。是可行的。如果您有这样的用例,请分享示例 PDF 以供检查。

使用正则表达式去水印后还需要另存为新的PDF文件吗?

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.