Java 为什么PDFBox返回大小为0 x 0的图像维度

Java 为什么PDFBox返回大小为0 x 0的图像维度,java,pdfbox,Java,Pdfbox,为了找到PDF上图像的实际大小,我使用PDFBox,并遵循中的描述。所以基本上我打电话 // Computes the image actual location and dimensions PrintImageLocations renderer = new PrintImageLocations(); for (int i = 0; i < pageLimit; ++i) { PDPage page = pdf.getPage(i); ren

为了找到PDF上图像的实际大小,我使用PDFBox,并遵循中的描述。所以基本上我打电话

 // Computes the image actual location and dimensions
 PrintImageLocations renderer = new PrintImageLocations();

 for (int i = 0; i < pageLimit; ++i) {
        PDPage page = pdf.getPage(i);

        renderer.processPage(page);
 }
//计算图像的实际位置和尺寸
PrintImageLocations渲染器=新的PrintImageLocations();
对于(int i=0;i
而PrintImageLocations()则取自

然而,对于我用于测试的PDF文档(由GPL Ghostscript 910(ps2write)根据找到的图像生成),报告的图像大小为0 x 0(尽管PDF可以导入Gimp或Libre Office Draw)

因此,我想知道我目前使用的代码是否可靠,是否无法找到图像大小,以及是什么导致它无法找到正确的图像大小

用于此测试的PDF

==========

编辑: 在@Itai comment之后,似乎条件
if(“Do”.equals(operation))
没有得到评估,因为没有调用此类操作。因此,调用了超类中的
processOperator

唯一被调用的操作是(我在被重写的
processOperator
方法中的条件之前添加了
System.err.println(“处理”+操作”);

加工质量 加工厘米 加工gs 加工质量 再加工 加工W 处理 处理rg 再加工 加工f 处理cs 处理scn 再加工 加工f 加工质量 加工质量

==========


感谢您的任何提示,

因为您已经了解到,0x0输出的原因是,
PrintImageLocations
As-is中的代码根本找不到图像

PrintImageLocations
找不到图像,因为它只查找页面内容中使用的图像以及页面内容中使用的XObject(也是嵌套的)形式。另一方面,在手头的文件中,图像绘制在用于填充页面内容区域的平铺图案内容中

为了使PDFBox能够找到此图像,我们必须将
PrintImageLocations
类扩展一点,以便也能进入模式内容流,例如:

class PrintImageLocationsImproved扩展了PrintImageLocations{
public printImageLocationSimProven()引发IOException{
超级();
addOperator(新的SetNonStrokingColor());
addOperator(新的setNonSrokingColorn());
addOperator(新设置NonStrokingDeviceCmyKColor());
addOperator(新设置NonStrokingDeviceGrayColor());
addOperator(新设置NonStrokingDevicerGBColor());
addOperator(新的setNonSrokingColorSpace());
}
@凌驾
受保护的void processOperator(运算符运算符、列表操作数)引发IOException{
字符串操作=operator.getName();
if(fillOperations.contains(操作)){
pColor=getGraphicsState().GetNonSrokingColor();
PDAbstractPattern=getResources().getPattern(color.getPatternName());
if(PDTilingPattern的模式实例){
processTilingPattern((PDTilingPattern)pattern,null,null);
}
}
超级处理运算符(运算符、操作数);
}
final List fillOperations=Arrays.asList(“f”、“f”、“f*”、“b”、“b*”、“b”、“b*”);
}
(内部类
PrintImageLocationsImproved

手边文档中的平铺图案用作填充的图案颜色,而不是笔划。因此,
PrintImageLocationsImproved
必须为非笔划颜色操作符注册操作符侦听器,以便在图形状态下正确更新填充颜色

processOperator
在委托给
PrintImageLocations
执行之前,现在首先检查操作符是否为填充操作。在这种情况下,它将检查当前填充颜色。如果是图案颜色,
processOperator
启动
PDFStreamEngine
中定义的
processTilingPattern
处理,该处理启动图案内容流的嵌套分析,从而最终让
PrintImageLocationsImproved
找到图像

使用
printImageLocation可以像这样

try(PDDocument=PDDocument.load(…)
{
PrintImageLocations打印机=新的PrintImageLocationsImproved();
int pageNum=0;
对于(PDPage:document.getPages())
{
pageNum++;
System.out.println(“处理页面:“+pageNum”);
打印机。处理页面(第页);
}
}
(test
testExtractLikeHelloWorld从顶级机密改进而来

因此,对于您的PDF文件,将找到以下图像:

处理页面:1
*******************************************************************
找到图像[R8]
PDF中的位置=39.0,用户空间单位为102.48
原始图像大小=12091640像素
显示大小=516.3119700.3752(用户空间单位)
显示尺寸=7.1709986,在72 dpi渲染时为9.727433英寸
72 dpi渲染时显示的尺寸=182.14336,247.0768毫米
当心,
这不是一个完美的解决方案,更像是一个概念验证和解决方案,因为它既不能正确地将填充图案限制在实际填充的区域,也不能为一个大到需要填充多个填充图案的区域返回多个查找。尽管如此,它仍会返回与手头文件匹配的图像。

是否所有大小都报告为0?完整输出是什么?@Itai它报告其他PDF上的实际大小。即使是看起来很相似的测试(就第一页而言)也显示了正确的大小。我的意思是-该图片的所有大小都报告为0吗?它应该打印像素大小、单位大小、实际大小等。它们都是0吗?猜对了@Itai!实际上,
if(PDImageXObject的xobject实例){