PDFBox不检测页面中的图像

时间:2015-05-28 07:03:46

标签: java pdfbox

我尝试使用PDFBox检测this pdf中的图像。 pdf有两个空白图像,一个在左侧(在文本下面#34;把它放在框中#34;)另一个在右侧(在文本下面"在外面贴上这个框&# 34)。这是我用来检测图像的代码:

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。

感谢。

1 个答案:

答案 0 :(得分:1)

简而言之

  

我能够检测到第二张图像。但是,未检测到第一张图像。有什么问题?

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

详细

如果您查看网页的内容流,最后会看到这一点:

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

前四行在位置832处绘制图像资源 Im1 ,126延伸至720 x 970,最后4行在位置绘制相同的图像资源 Im1 144,968拉伸到512 x 128。

怎么做

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

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

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来解析处理的内容以绘制页面。