【问题标题】:Understanding the arguments of PDPageContentStream.setTextMatrix()了解 PDPageContentStream.setTextMatrix() 的参数
【发布时间】:2016-09-28 22:34:58
【问题描述】:

我无法理解PDPageContentStream.setTextMatrix(Matrix m) 的参数矩阵m 中的6 个值表示什么。以前它使用 6 个值,但现在它需要一个包含所有值的矩阵。

是的,我已阅读文档,但发现解释完全没用 -

public void setTextMatrix(double a,
             double b,
             double c,
             double d,
             double e,
             double f)
               throws IOException

The Tm operator. Sets the text matrix to the given values. A current text matrix will be replaced with the new one.

Parameters:
a - The a value of the matrix.
b - The b value of the matrix.
c - The c value of the matrix.
d - The d value of the matrix.
e - The e value of the matrix.
f - The f value of the matrix.

我也搜索了示例,但我没有找到对这些值的解释。另外,奇怪的是,当我对 2 个不同的 PDF 文件尝试相同的值时,结果不同,所以我假设这与边距和距离等有关。

我觉得我在做猜测工作是在浪费时间。对论点的直接解释将非常好。

编辑

我知道矩阵以及如何传递值。我不知道矩阵中的值实际上是什么意思。

【问题讨论】:

  • 查看所做的编辑。
  • 可以去看看java文档中关于AffineTransform的解释,除了参数不同外,这个是一样的。另见 Matrix 的静态方法。*
  • 另请阅读处理坐标系的 pdf 规范部分。
  • scaleXm00 ShearYm10 ShearXm01 scaleYm11 transXm02 transYm12 - 这很令人困惑,因为 Adob​​e 使用了不同于 java 的排序方式。

标签: android pdfbox


【解决方案1】:

您可以尝试绕过新方法要求,使用 Matrix constructors 之一

setTextMatrix(new Matrix(Double.valueOf(a).floatValue(),
                             Double.valueOf(b).floatValue(),
                             Double.valueOf(c).floatValue(),
                             Double.valueOf(d).floatValue(),
                             Double.valueOf(e).floatValue(),
                             Double.valueOf(f).floatValue()))

损失一些double 准确性的风险很小。

编辑:
你可以看看这个例子 - UsingTextMatrix

Per PDPageContentStream.java这是已弃用的setTextMethod,您查询过:

@Deprecated
public void setTextMatrix(double a, double b, double c, double d, double e, double f) throws IOException
{
    setTextMatrix(new Matrix((float)a, (float)b, (float)c, (float)d, (float)e, (float)f));
} 

这基本上可以满足我上面的尝试。因此,除了更紧凑的用法之外,不应该有任何重大差异。有关更多信息,请访问 org.apache.pdfbox.pdmodel.PDPageContentStream 类。

关于单浮点/双精度值的含义:

a, b, c, d, e, f 定义一个org.apache.pdfbox.cos.COSArray 的形式:

 static final float[] DEFAULT_SINGLE =
 {
        a,b,0,  
        c,d,0, 
        e,f,1 
 };

在哪里

a stands for ScaleX
b stands for ShearY
c stands for ShearX
d stands for ScaleY
e stands for TranslateX
f stands for TranslateY

Wiki about Affine Transformations 中,您可以阅读到您可以使用这些值做什么。下面直观地表示了可能的操作:

注意:tXtYorg.apache.pdfbox.util.Matrix和上图中的位置略有不同。

希望这能解决问题。

【讨论】:

  • 你只是告诉我数据类型,你没有告诉我什么是 a 值,什么是 b 值等。这些是 x/y 坐标还是平移等
  • @Yuganka 你知道线性代数吗?特别是如何在数学上将平移、旋转等表示为仿射变换,以及如何通过将二维平面嵌入到三维空间中,您可以通过 3x3 矩阵的子集对平面的仿射变换进行建模?在计算机图形学中,您通常需要了解一些基本的数学知识。
猜你喜欢
  • 2011-09-30
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2020-06-23
  • 2023-03-13
相关资源
最近更新 更多