gpt4 book ai didi

metadata - 如何识别 PDF 水印并使用 PDFBox 将其删除

转载 作者:行者123 更新时间:2023-12-02 01:51:38 25 4
gpt4 key购买 nike

我正在尝试使用 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("--------------------------------------------------------------------------------");
}
}
}

最佳答案

与您的假设相反,PDF 中没有显式水印对象来识别通用 PDF 中的水印。

水印可以通过多种方式应用于 PDF 页面;每个 PDF 创建库或应用程序都有自己的添加水印的方法,有些甚至提供多种方法。

水印可以

  1. 在内容早期绘制的任何内容(位图图形、矢量图形、文本...),因此形成绘制其余内容的背景;
  2. 任何内容(位图图形、矢量图形、文本等)在内容后期以透明方式绘制,形成透明叠加层;
  3. 在水印注释的内容流中绘制的任何内容(位图图形、矢量图形、文本...),应用于表示应以固定尺寸和位置打印在页面上的图形,无论打印页面的尺寸如何(参见 PDF 规范第 12.5.6.22 节 ISO 32000-1)。

有时甚至使用混合形式,看看at this answer例如,在底部,您会发现在图形上方但在文本下方绘制的“水印”(以便于阅读)。

后一种选择(水印注释)显然很容易去除,但它实际上也是最不常用的选择,很可能因为它很容易去除去掉;应用水印的人通常不希望他们的水印丢失。此外,注释有时会被 PDF 查看器错误处理,并且代码复制页面内容通常会忽略注释。

如果您不处理通用文档,而是处理特定类型的文档(所有生成的都是类似的),另一方面,应用水印的方式在它们中,可能可以识别并且提取程序可能是可行的。如果您有这样的用例,请分享示例 PDF 以供检查。

关于metadata - 如何识别 PDF 水印并使用 PDFBox 将其删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22318385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com