【问题标题】:How to read a PDF text matrix如何阅读 PDF 文本矩阵
【发布时间】:2013-04-18 04:21:07
【问题描述】:

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

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

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

我相信这与文本矩阵有关,我试图找到对这些值的简单解释。 我了解 sin 和 cosin,但不了解如何指定值的布局。 示例:我找到了旋转的解释: 对于 a b c d e f 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 示例文件并找出我不理解的东西(文本矩阵除外)

谢谢 理查德

【问题讨论】:

  • 你知道多少线性代数?告诉我们这可能有助于我们不要在太简单或太复杂的层面上解释。话虽如此,您不需要操纵变换矩阵来创建横向格式,也不需要旋转......

标签: pdf text matrix


【解决方案1】:

PDF 中使用的矩阵是Affine transforms

tm将参数加载到:

|a b 0|
|c d 0|
|e f 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找到

希望这对某人有所帮助。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      点定义

      [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, tx, 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

      【讨论】:

      • 翻译错误:y_new = 1*x + 0*y + ty;显然是错误的。
      • 旋转错误:您的矩阵与代码不匹配,在sins 上切换符号。也很奇怪:图形使用 theta 但您的代码使用 alpha.
      • @mkl 感谢您仔细阅读我的答案并发现错误。我希望我做出了适当的更正。
      • @mkl 我发现 pdf 规范很难阅读。一周以来,我一直在努力弄清楚如何计算用户空间中角色的 x 和 y 位置。是否有任何网站解释如何进行该计算?
      • 只要你知道你必须跟踪当前的转换矩阵(特别是 cm 不会替换它的参数矩阵,但由它转换;您还需要跟踪保存和恢复的图形状态),ISO 32000-1 IMO 的第 9.4.4 节“文本空间详细信息”解释了这一切,另见@987654324 @.
      猜你喜欢
      • 2017-06-01
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多