7

我正在编写一个程序来直接从我的程序创建 PDF 文件。我使用了 PDF 参考手册并设法弄清楚了除了 1 件事之外的所有内容。文本矩阵——它必须是我读过的最令人困惑的东西,用谷歌搜索、重新阅读、重新搜索和重新阅读,但仍然不理解它。大约在我认为我理解它的时候,出现了一些事情,我意识到我没有。

我遇到的问题是创建标准 11 x 8.5 大小(792 x 612)的横向 PDF 文件。我可以创建文件,并且所有内容在横向中看起来和显示正确。

现在我想删除出现在每个页面上的所有常见文本并将其放入 Form XObject 并使用 Do 将其添加到每个页面。我有这个非常适合肖像 PDF 文件。当我对 Landscape PDF 文件尝试相同的操作时,Form Xobject 文本的旋转与页面的其余部分不同。显然,页面的旋转并不关心 Form XObject。

我相信这与文本矩阵有关,我试图找到对这些值的简单解释。我了解 sin 和 cosin,但不了解如何指定值的布局。示例:我找到了旋转的解释:对于 abcdef tm 产生旋转 cos0 sin0 -sin0 cos0 0 0 将坐标系轴逆时针旋转角度 0...嗯?我理解 sin cosin 和“逆时针”但仅此而已 找不到简单的例子我想我需要看一些例子来理解这一点

文本矩阵会是什么样子:

  • 0旋转?
  • 90转?
  • 180转?
  • 270转?

我找到了这个例子,但似乎无法破译它的意思

这个文本矩阵用简单的英语翻译成什么。

示例文本矩阵:0 1 -1 0 07 07 Tm

每个值代表什么?

  • 0 =
  • 1 =
  • -1 =
  • 0 =
  • 07 =
  • 07 =

任何帮助将不胜感激。任何带有简单英语解释的示例将不胜感激任何带有横向文件和表单 Xobject 的示例 PDF 文件将不胜感激一张图片值一千字,所以我通常可以用记事本打开 PDF 示例文件并找出我不明白的东西(文本矩阵除外)

谢谢理查德

4

3 回答 3

23

PDF 中使用的矩阵是仿射变换

tm将参数加载到:

|ab 0|
|cd 0|
|ef 1|

在哪里:

a is Scale_x
b is Shear_x
c is Shear_y
d is Scale_y
e is offset x
f is offset y

可以在http://docstore.mik.ua/orelly/java-ent/jfc/ch04_11.htm找到一个很好的介绍

希望这可以帮助某人。

于 2013-06-19T22:55:06.497 回答
3

PDF 开发人员参考 https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/pdf_reference_archives/PDFReference.pdf中的第4.2.2 章常见转换对您来说也很有趣

于 2013-09-15T20:01:56.723 回答
1

点定义

[x, y, 1]

这是一个一维向量(数组),它把点放在坐标 x 和 y 上。1 不需要指定点位置,但它有助于计算不同坐标系中点的位置,例如从设备独立像素到设备相关像素。

平移计算

x_new = a*x + c*y + e;
y_new = b*x + d*y + f;

写成 matix,计算如下:

翻译矩阵

平移移动一个点。

[1, 0, 0, 1, 发送, ty]

x_new = 1*x + 0*y + tx;
y_new = 0*x + 1*y + ty;

或者

x_new = x + tx;
y_new = y + ty;

旋转矩阵

在此处输入图像描述

[cos(theta), sin(theta), -sin(theta), cos(theta), 0, 0]

x_new = cos(theta)*x - sin(theta)*y + 0;
y_new = sin(theta)*x + cos(theta)*y + 0;

0度旋转,cos(0)=1, sin(0)=0: [1, 0, -0, 1, 0, 0]

x_new = 1*x + 0*y + 0;
y_new = 0*x + 1*y + 0;

或者

x_new = x;
y_new = y;

90度旋转,cos(90)=0, sin(90)=1: [0, 1, -1, 0, 0, 0]

x_new = 0*x + -1*y + 0;
y_new = 1*x + 0*y + 0;

或者

x_new = -y;
y_new = x;

180度旋转,cos(180)=-1, sin(180)=0: [-1, 0, -0, -1, 0, 0]

x_new = -1*x + 0*y + 0;
y_new = 0*x + -1*y + 0;

或者

x_new = -x;
y_new = -y;

270度旋转,cos(270)=0, sin(270)=-1: [0, -1, 1, 0, 0, 0]

x_new = 0*x + 1*y + 0;
y_new = -1*x + 0*y + 0;

或者

x_new = y;
y_new = -x;

示例文本矩阵

[0 1 -1 0 07 07]

0 1 -1 0:旋转 90 度 07 07:在每个 x 和 y 方向上平移(偏移)7

于 2020-11-01T10:34:13.537 回答