PDFBox 未检测到页面中的图像

PDFBox not detecting image in page

我正在尝试使用 PDFBox 检测 this pdf 中的图像。 pdf 有两个空白图像,一个在左侧(在文本“将此放入框内”下方),另一个在右侧(在文本“将此贴在框外”下方)。这是我用来检测图像的代码:

PDPage page = (PDPage) catalog.getAllPages().get(0);
PDStream contents = page.getContents();
PDFStreamParser parser = new PDFStreamParser(contents.getStream());
parser.parse();
List<Object> tokens = parser.getTokens();

PDResources resources = page.getResources();
Map<String, PDXObjectImage> images = resources.getImages();
if(null != images){
        Iterator<String> it = images.keySet().iterator();
        while(it.hasNext()){
            String key = it.next();
            System.out.println("Key >>>>>>>>>>>>>> "+key);
        }
}

我可以检测到第二张图片。但是,未检测到第一张图像。问题是什么?我确定pdf是正确的。我创建了很多次,但我仍然面临同样的问题。我使用 Sketch 创建了 pdf。

谢谢。

简而言之

I'm able to detect the second image. However, the first image is not being detected. What is the problem?

实际上两个页面图像使用相同的图像资源,只是拉伸到不同的尺寸。

详细

如果您查看页面的内容流,您会在末尾看到:

q
720 0 0 970 832 126 cm
/Im1 Do
Q
q
512 0 0 128 144 968 cm
/Im1 Do
Q

前四行绘制图片资源Im1在位置832,126拉伸为720 x 970,后4行绘制相同的图片资源 Im1 在位置 144, 968 拉伸到 512 x 128.

做什么

您仅通过查看页面资源来查找页面图像的方法是不合适的,因为

  • 如您所见,单个图像资源可能会在拉伸到不同尺寸的页面上多次使用,
  • 页面上可能根本不会使用图像资源(例如,某些文档有一个从所有页面引用的大资源字典;对于给定页面,可能不会使用许多资源),
  • 图像可以内联到内容流中;你的方法根本看不到这些图像,并且
  • form Xobjects 或 patterns 可能会显示在您的页面上,它们可能分别在自己的资源中有图像;由于您只查看直接页面资源中包含的图像资源,因此您的方法也不会找到它们。

PDFBox 示例 PrintImageLocations 中提供了一个更好的解决方案(仅对内联和可能有图案的图像失败),您的文件的输出是

*******************************************************************
Found image [Im1]
position = 832.0, 128.0
size = 360px, 462px
size = 720.0, 970.0
size = 10.0in, 13.472222in
size = 254.0mm, 342.19446mm

*******************************************************************
Found image [Im1]
position = 144.0, 128.0
size = 360px, 462px
size = 512.0, 128.0
size = 7.111111in, 1.7777778in
size = 180.62222mm, 45.155556mm

此示例使用 PDFBox PDFStreamEngine 解析处理过的内容以绘制页面。