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

时间:2017-07-06 06:47:02

标签: pdf pdfbox

我正在使用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

然而,插图画家左下角y的正确值是: 2211

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

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

1 个答案:

答案 0 :(得分:1)

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

从源代码下载或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表单的边界,但它也用作剪切矩形,并且与当前剪切区域相交,因此在某些情况下,您可能并不总是看到所有内容。

要验证&#34; bbox已转换&#34;的坐标,请使用PDFDebugger命令行应用程序打开该文件。移动光标直到数字匹配。

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