XObject Form Bounding Box 的 y,x 坐标错误 - PDFBOX

Posted

技术标签:

【中文标题】XObject Form Bounding Box 的 y,x 坐标错误 - PDFBOX【英文标题】:Wrong y,x coordinates for XObject Form Bounding Box - PDFBOX 【发布时间】:2017-07-06 06:47:02 【问题描述】:

我正在使用 PdfBox 读取 pdf 中的 Xobjects,xobjects 的类型为 Form,我注意到左下 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
   

实际显示的结果是: 左下 y : -2494.4902 右上y:-283.47314

但是,illustrator 中左下 y 的正确值是: 2211

现在我知道左上角是 0,0,这不是问题,问题是值 -2494 超出了修剪框。

您可以在此处查看 pdf 链接: https://www.justbeamit.com/zxime

【问题讨论】:

这不是它的工作方式...... bbox 不会告诉 xobject 表单要呈现的位置:These boundaries shall be used to clip the form XObject and to determine its size for caching. 显示位置取决于 ctm:Each time the form XObject is painted by the Do operator, this matrix shall be concatenated with the current transformation matrix to define the mapping from form space to device space. @TilmanHausherr:能否请您扩展您的答案,请您使用 pdf 框调试器工具显示数据,这将非常有帮助,我应该在哪里看? imgur.com/a/R64Cv 或者有没有一种简单的方法可以使用 pdfbox 读取显示选项? 请更正您的 PDF 链接。答案比仅仅查看正确的条目更复杂。同一个表单 xobject 可以出现在多个地方。顺便说一句,你确定你真的需要表单 xobjects 而不是某些 acroform 字段的位置吗? @TilmanHausherr 嗨,我设法获得了显示位置,您的回答是关键,非常感谢:D,是的,我现在确实需要 xobjects 位置。再次感谢,你是男人 【参考方案1】:

bbox 本身并不会告诉 xobject 表单将在哪里呈现:这些边界将用于剪切表单 XObject 并确定其大小以进行缓存。显示位置取决于 ctm(= 当前变换矩阵):每次通过 Do 运算符绘制表单 XObject 时,该矩阵应与当前变换矩阵连接以定义从表单空间到设备空间的映射。

从源代码下载或the repository获取 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 转换”的坐标,请使用 PDFDebugger 命令行应用程序打开文件。移动光标直到数字匹配。

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

【讨论】:

非常感谢 Tilman 的帮助,如果没有你,我将无法解决它。再次感谢。

以上是关于XObject Form Bounding Box 的 y,x 坐标错误 - PDFBOX的主要内容,如果未能解决你的问题,请参考以下文章

Bounding-box 回归

yolo 算法 网格的两个bounding box大小是怎么确定的

python plot_bounding_box.py

Bounding-Box(BB)regression

目标检测中bounding box regression

Bounding Box回归