我正在使用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
答案 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显示了如何获得它们)