XObject窗体边界框的y、x坐标错误-PDFBOX

XObject窗体边界框的y、x坐标错误-PDFBOX,pdf,pdfbox,Pdf,Pdfbox,我使用PdfBox读取pdf中的XObject,XObject是类型形式,我注意到左下角y和右上角y的值错误,illustrator/pdf查看器显示的渲染正确 这是我找到y坐标的代码 PDDocument document = PDDocument.load(new File("D:/temp/temp.pdf")); PDResources pdResources = document.getPage(0).getResources(); Iterable<CO

我使用PdfBox读取pdf中的XObject,XObject是类型形式,我注意到左下角y和右上角y的值错误,illustrator/pdf查看器显示的渲染正确

这是我找到y坐标的代码

    PDDocument document = PDDocument.load(new File("D:/temp/temp.pdf"));
    PDResources pdResources = document.getPage(0).getResources();
    Iterable<COSName> cosNames = pdResources.getXObjectNames();
    for (COSName cosname : cosNames) {
    PDXObject xobject = pdResources.getXObject(cosname);
    COSStream stream = xobject.getCOSObject();
    PDFormXObject pdxObjectForm = new PDFormXObject(stream);
    System.out.println(pdxObjectForm.getBBox().getLowerLeftY());
    System.out.println(pdxObjectForm.getBBox().getUpperRightY());
}
    document.close();
    // TODO: handle exception
 }  
PDDocument document=PDDocument.load(新文件(“D:/temp/temp.pdf”);
PDResources PDResources=document.getPage(0.getResources();
Iterable cosNames=pdResources.getXObjectNames();
for(COSName COSName:COSName){
PDXObject xobject=pdResources.getXObject(cosname);
costream=xobject.getCOSObject();
PDFormXObject PdXObject Form=新的PDFormXObject(流);
System.out.println(pdxObjectForm.getBBox().getLowerLeftY());
System.out.println(pdxObjectForm.getBBox().getUpperRightY());
}
document.close();
//TODO:处理异常
}  
实际显示的结果如下: 左下y:-2494.4902 右上角y:-283.47314

但是,illustrator中左下y的右值为: 2211

现在我知道左上角是0,0,这不是问题所在,问题是-2494的值超出了范围

您可以在此处查看pdf链接:

bbox本身不知道xobject表单的渲染位置:这些边界应用于剪裁表单xobject并确定其缓存大小。显示位置取决于ctm(=当前变换矩阵):每当
Do
运算符绘制表单XObject时,该矩阵应与当前变换矩阵连接,以定义从表单空间到设备空间的映射

以源代码下载或中的PrintImageLocations.java示例为例

您将发现以下部分:

else if(xobject instanceof PDFormXObject)
{
    PDFormXObject form = (PDFormXObject)xobject;
    showForm(form);
}
将其更改为:

else if(xobject instanceof PDFormXObject)
{
    PDFormXObject form = (PDFormXObject)xobject;

    PDRectangle bbox = form.getBBox();
    Matrix ctm = getGraphicsState().getCurrentTransformationMatrix().clone();
    ctm.concatenate(form.getMatrix());
    System.out.println("Found form [" + objectName.getName() + "]");
    System.out.println("bbox: " + bbox);
    Rectangle2D transformedBBox = bbox.transform(ctm).getBounds2D();
    System.out.println("bbox transformed: " + transformedBBox);

    showForm(form);
}
请注意,变换后的bbox是xobject表单的边界,但它也用作剪切矩形,并且与当前剪切区域相交,因此在某些情况下,您可能无法始终看到所有内容

要验证“bbox transformed”的坐标,请使用PDFDebugger命令行应用程序打开该文件。移动光标,直到数字匹配


(我们在场外进行了一些讨论。我还被问及其他形状;这些是矢量图形。演示了如何获得它们)

这不是它的工作方式。。。bbox不会告诉xobject表单的呈现位置:
这些边界应用于剪裁表单xobject并确定其缓存大小。
显示位置取决于ctm:
Do操作员每次绘制表单xobject时,此矩阵应与当前转换矩阵连接,以定义从表单空间到设备空间的映射。
@TilmanHausherr:请您扩展您的答案,请您使用pdf框调试器工具显示数据,这将非常有用,我应该看哪里?或者有没有一种使用pdfbox阅读显示选项的简单方法?请更正指向PDF的链接。答案比只看正确的条目更复杂。同一形式的xobject可以出现在多个位置。顺便说一句,你确定你真的需要表单XObject而不是某些acroform字段的位置吗?@Tilmahauser嗨,我设法得到了显示位置,你的答案是关键,非常感谢:D,是的,我现在确实需要XObject的位置。再次感谢你的帮助,你是曼坦克斯多蒂尔曼,没有你,我不可能解决它。再次感谢。