PDF 页面的原点 (x,y) 在哪里?
Where is the Origin (x,y) of a PDF page?
我正在使用 iText
创建我的 PDF 文件。
我想使用我在此处找到的方法将文本定位在文档中的某个特定位置:itext positioning text absolutely。
但是,我不知道在哪里可以找到页面坐标系的原点。
bottom left corner
? top right corner
? bottom right corner
? top left corner
?
这是哪里来的?
页面的尺寸(也称为页面边界)在页面字典中定义:
/MediaBox
:物理媒介(页面)的边界。此值是强制性的,因此您会在每个 PDF 中找到它。
/CropBox
:显示或打印时可见的区域。 /CropBox
等于或小于 /MediaBox
。这个值是可选的;如果缺少,则 /CropBox
等于 /MediaBox
.
- 其他可能的值是
/BleedBox
、/TrimBox
和 /ArtBox
。这些已为特定目的定义,但不再经常使用。如果缺少,则默认为 /CropBox
。 None 这些值可以超过 /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
构造函数的四个参数(llx
、lly
、urx
、ury
)使用x和y定义了一个矩形左下角和右上角的坐标。
在new Rectangle(0, 0, 595, 842)
的情况下,页面的左下角与坐标系原点重合(0, 0)
。页面右上角与坐标重合(595, 842)
.
所有度量均以用户单位定义,默认情况下,用户单位大致对应于印刷点:1个用户单位= 1个点。
注意这个词粗略:我们用点数来做计算,但是在ISO标准中,我们非常谨慎,不要用点数作为用户单位的同义词。例如:A4 页面尺寸为 595 x 842 用户单位,但如果您以点为单位计算精确值,则会有细微差异(点后的一些数字)。
页面的左下角并不总是坐标系的原点。如果我们使用 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 度(默认)更改为另一个角度。您还可以缩放轴以获得不同的纵横比。虽然这样做当然很有趣,但它需要相当多的数学知识。
请注意,在大多数 PDF 生成器中,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.
要在 PDF 中绘制矩形,使用此类生成器,然后包含 A-4 大小的页面,您需要将矩形定义为:
rectangle = new Rectangle(25, 25, 575, 820);
rectangle. set Border(Rectangle.BOX);
rectangle. set Border Width(1);
document.add(rectangle);
我正在使用 iText
创建我的 PDF 文件。
我想使用我在此处找到的方法将文本定位在文档中的某个特定位置:itext positioning text absolutely。
但是,我不知道在哪里可以找到页面坐标系的原点。
bottom left corner
? top right corner
? bottom right corner
? top left corner
?
这是哪里来的?
页面的尺寸(也称为页面边界)在页面字典中定义:
/MediaBox
:物理媒介(页面)的边界。此值是强制性的,因此您会在每个 PDF 中找到它。/CropBox
:显示或打印时可见的区域。/CropBox
等于或小于/MediaBox
。这个值是可选的;如果缺少,则/CropBox
等于/MediaBox
.- 其他可能的值是
/BleedBox
、/TrimBox
和/ArtBox
。这些已为特定目的定义,但不再经常使用。如果缺少,则默认为/CropBox
。 None 这些值可以超过/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
构造函数的四个参数(llx
、lly
、urx
、ury
)使用x和y定义了一个矩形左下角和右上角的坐标。
在new Rectangle(0, 0, 595, 842)
的情况下,页面的左下角与坐标系原点重合(0, 0)
。页面右上角与坐标重合(595, 842)
.
所有度量均以用户单位定义,默认情况下,用户单位大致对应于印刷点:1个用户单位= 1个点。
注意这个词粗略:我们用点数来做计算,但是在ISO标准中,我们非常谨慎,不要用点数作为用户单位的同义词。例如:A4 页面尺寸为 595 x 842 用户单位,但如果您以点为单位计算精确值,则会有细微差异(点后的一些数字)。
页面的左下角并不总是坐标系的原点。如果我们使用 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 度(默认)更改为另一个角度。您还可以缩放轴以获得不同的纵横比。虽然这样做当然很有趣,但它需要相当多的数学知识。
请注意,在大多数 PDF 生成器中,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.
要在 PDF 中绘制矩形,使用此类生成器,然后包含 A-4 大小的页面,您需要将矩形定义为:
rectangle = new Rectangle(25, 25, 575, 820);
rectangle. set Border(Rectangle.BOX);
rectangle. set Border Width(1);
document.add(rectangle);