PDF Formfield 字体大小:默认外观与外观流
Posted
技术标签:
【中文标题】PDF Formfield 字体大小:默认外观与外观流【英文标题】:PDF Formfield font size: Default appearance vs. appearance stream 【发布时间】:2022-01-22 18:20:05 【问题描述】:我提取表单域的字体大小以获取有关其大小的信息(使用 iText)。这适用于大多数文档,但是对于某些文档,我的字体大小为 1,因为在外观上字体大小为 1。但是,如果我在几个不同的查看器中打开 PDF,则此文本字段的大小始终为 8。我想表单域应该根据其外观呈现?那么为什么 PDF 查看器使用默认外观而不是外观流中定义的字体大小?
更新:正如 MKL 提到的,我确实忘记考虑文本矩阵。 我确实为字体实现了自己的 RenderListener。有谁知道如何应用缩放?
public class PdfStreamFontExtractor implements RenderListener
@Override
public void usedFont(DocumentFont font, float fontSize)
this.font=font;
this.fontSize=fontSize;
@Override
public void renderText(TextRenderInfo renderInfo)
//get scaling factor from textToUserSpaceTransformMatrix?
...
【问题讨论】:
关于您的更新 - 我们可以假设您使用哪个版本的 itext? ~2.1.7。 (几乎打开PDF ;-) 嗯,2.1.7 中没有RenderListener
;)。该类仅在 4.2.0 的添加中引入(即使它本身说 @since 2.1.6
)。我们可以假设您的parser
包处于 4.2.0 的状态吗?当前的 OpenPdf 中不再存在 RenderListener
类...
啊好吧不知道。是的,该课程确实存在。这有帮助吗?
好吧,看看我的答案的编辑... ;)
【参考方案1】:
但是即使在外观流中有效字号也是8!
看看整个文本对象:
BT
8 0 0 8 2 5.55 Tm
/TT1 1 Tf
[...] TJ
ET
开始时设置的文本矩阵将所有内容缩放 8 倍。因此,此后绘制的文本的有效字体大小为 8 × 1 = 8。
诚然,虽然您经常可以在常规内容中看到缩放文本矩阵与大小 1 Tf 指令相结合,但我还没有在表单字段外观中看到这一点。我想这很不常见。
关于您的更新...
有人知道如何应用缩放吗?
@Override public void renderText(TextRenderInfo renderInfo) //get scaling factor from textToUserSpaceTransformMatrix?
嗯,这取决于你想如何测量转换后的大小。
一种方法是采用与字体大小一样长的垂直向量(在 Tf 指令中给出),将其转换为textToUserSpaceTransformMatrix
,并获取转换结果的长度:
@Override
public void renderText(TextRenderInfo renderInfo)
scaledfontSize=renderInfo.getTransformedFontSize(unScaledfontSize);
public class TextRenderInfo
...
public float getTransformedFontSize(float fontSize)
return new Vector(0, fontSize, 0).cross(this.textToUserSpaceTransformMatrix).length();
...
如果变换仅包含反射、旋转和缩放,则结果应该符合预期。如果涉及倾斜效果,您可能希望在取长度之前将该变换后的矢量投影到与变换后的书写方向垂直的平面上。
【讨论】:
该死的我没有考虑检查矩阵 :-|现在我必须想办法将缩放应用到 fontSize...Argh 我的矩阵计算时间已经有一段时间了:-D 完美!我用有效的实现更新了你的帖子。非常感谢以上是关于PDF Formfield 字体大小:默认外观与外观流的主要内容,如果未能解决你的问题,请参考以下文章
夯实基础--CSS=> 字体样式(font)外观属性(行高)
如果在 PDF 表单中多次出现,Java PDFBox 不会保持字段的字体外观