java - 为什么 setSkew 会增加文本大小?

标签 java itext

我使用的是 iText 版本 5.2.1。 为了完全理解 Chunk 对象的 setSkew 方法,我开始使用以下代码来使用它:

  for (int i=0; i <= 90; i+=5) {
    Chunk c = new Chunk("A" + i);
    c.setSkew((float)i, (float)-i);
    document.add(c);
  }

令我惊讶的是,当接近 90 度时,文本逐渐变大。我无法理解这种行为:根据“itext in action 第二版”。 book 中,setSkew 的第一个参数是文本基线的倾斜度,第二个参数是字符与(原始)基线之间的角度。

那么,我缺少什么?

最佳答案

您本质上缺少的是您期望参数的倾斜仅仅是类似于简单旋转的东西,它将保持尺寸不变。这不是倾斜的情况。相反,倾斜的工作方式如下:

sketch explaining skewing

(厚颜无耻地抄袭 PDF specification ISO 32000-1:2008 中的“图 13 – 坐标变换的效果”)

保持不变的是倾斜基线到文本行常规基线的投影长度:

sketch with baseline projections x0 and x1

这里 x0 和 x1 具有相同的长度,但倾斜的基线更长。角度越陡,倾斜的基线就越长,那里的字形宽度也就越长。

模拟适用于 y 轴。因此,您的示例结果如下:

enter image description here

如果您更喜欢数学推理,请考虑倾斜变换矩阵的值为 [1 tan(a) tan(b) 1 0 0]。因此 (1, 0) 偏斜为 (1, tan(a)),(0, 1) 偏斜为 (tan(b), 1),其他所有内容都根据线性相应地倾斜。

关于java - 为什么 setSkew 会增加文本大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15427128/

相关文章:

java - 如何使用第三方字体从 Unicode 字符集语言创建 PDF 文档

java - 在 tomcat 7 上运行 jersey servlet 的 servlet init 异常

java - HikariCP - 负载测试使性能下降到停止

java - 适用于 Android 的 2D 图形库

java - 为什么粗体 + 斜体不起作用?

java - 使用 itext 和 pdfbox 合并 PDF

java - BouncycaSTLe 依赖冲突

android - 在 Unity3D 和 ItextSharp 中使用自定义字体

c# - Ver 5.5.4+ 中的 ItextSharp 字体颜色问题

java - 为什么要使用 websocket,使用它有什么好处?