PDF页面的Origin(x,y)在哪里?

时间:2015-05-19 07:25:37

标签: java pdf text itext

我正在使用iText来创建 PDF 文件。

我想使用我在此处找到的方法将文本放置在文档中的某个特定位置:itext positioning text absolutely

但是,我无法弄清楚在哪里可以找到页面坐标系的原点。

bottom left cornertop right cornerbottom right cornertop left corner

这个来源在哪里?

2 个答案:

答案 0 :(得分:9)

页面的维度(也就是页面边界)在页面字典中定义:

  • /MediaBox:物理媒介(页面)的边界。此值是必填项,因此您可以在每个PDF中找到它。
  • /CropBox:显示或打印时可见的区域。 /CropBox等于或小于/MediaBox。该值是可选的;如果它丢失,/CropBox等于/MediaBox
  • 其他可能的值包括/BleedBox/TrimBox/ArtBox。这些已经被定义用于特定目的,但它们不再被使用。如果丢失,则默认为/CropBox。这些值都不会超过/CropBox

使用iText创建文档时,可以显式或隐式定义/MediaBox

显式:

Rectangle rect = new Rectangle(20, 20, 300, 600);
Document document = new Document(rect);

隐式:

Document document = new Document();

这一行相当于:

Rectangle rect = new Rectangle(0, 0, 595, 842);
Document document = new Document(rect);

传递给Rectangle构造函数的四个参数(llxllyurxury)使用x和y坐标定义一个矩形左下角和右上角。

如果是new Rectangle(0, 0, 595, 842),则页面的左下角与坐标系(0, 0)的原点重合。页面的右上角与坐标(595, 842)重合。

所有测量都以用户单位定义,默认情况下,粗略的用户单位与印刷点相对应:1个用户单位= 1个点。

注意一词:我们使用点进行计算,但在ISO标准中,我们非常谨慎,不要将point用作用户单位的同义词。例如:一个A4页面用842个用户单位测量595,但是如果你用点计算精确值,则会有一点点差异(点之后的一些数字)。

页面的左下角并不总是坐标系的原点。如果我们使用Rectangle(20, 20, 300, 600)定义页面,则原点是下方的20个用户单位和左下角左侧的20个用户单位。也可以使用负值来定义页面大小。

例如:假设您要创建一个包含4个A4页面的A2文档,而不是像这样定义页面大小:

Rectangle(-595, 0, 0, 842)   Rectangle(0, 0, 595, 842)
Rectangle(-595, -842, 0, 0)  Rectangle(0, -842, 595, 0);

通过像这样定义媒体框,您还可以传递有关不同页面的相对位置的信息。如果以4个A4页为单位,坐标系的原点就是A2页的确切中心。

重要:

以上所有假设您没有引入任何坐标转换,例如:使用concatCTM()transform()方法。这些方法允许您更改坐标系,例如将x和y轴之间的角度从90度(默认值)更改为另一个角度。您还可以缩放轴以获得不同的宽高比。虽然这样做很有趣,但它需要相当多的数学。

答案 1 :(得分:0)

请注意,PDF页面的原点位于左下角(0,0)。

1 inch = 72 points and 1 cm = 1/2.54 inch = 0.3937 inch = 28.3 points.
where,
(lower left x coordinate)l l x=margin from left.
(lower left y coordinate)l l y=margin from bottom(bottom of rectangle)
(upper right x coordinate)u r x=width of article
(upper right y coordinate)u r y=margin from bottom of upper boundary of article.

要在包含A-4尺寸页面的PDF中绘制矩形,您需要将矩形定义为

rectangle = new Rectangle(25, 25, 575, 820);
rectangle. set Border(Rectangle.BOX);
rectangle. set Border Width(1);
document.add(rectangle);