【发布时间】:2021-06-29 13:28:23
【问题描述】:
我和我的团队最近从 ITextSharp 更改为 PdfSharp,因为 ITextSharp 变得非常慢,我们似乎无法解决问题。
但是现在我们遇到了一个问题,我们的由 PdfSharp 填充的 pdf 比来自 ITextSharp 的大 200kb。大小本身不是问题,当我们在 Firefox 中打开 pdf 时,数据在查看器中仍然显示得很好,但是当我们要打印它时,所有的多行字段突然变成一个衬里,不同的字体也是。
我们的 acroform 元素上有 /NeedAppearance,并尝试将其删除以查看它在 adobe 等中的外观,它看起来与在 Firefox 中的打印屏幕上相同。
NeedAppearance 不在我们来自 ITextSharp 的文档中,它在每个查看器中都能正常显示。
这是我们用来设置文本的代码:
public static bool SetField(this PdfAcroForm form, string fieldName, string value)
{
PdfTextField field = (PdfTextField)form.Fields[fieldName];
if (field != null)
{
field.Text = value;
}
return field != null;
}
在设置字段的末尾,我们有一个document.flatten() 来使字段只读。
一点旁注
一旦我们在 adobe 中打开了 pdf,并且我们想要关闭它,它希望我们保存它,而无需我们更改文档。一旦我们保存它,它就会减少 200kb,并且突然在所有查看器中都可以使用。这是/NeedAppearance 开启。
更新 1
我整晚都在寻找解决方案,但找不到。 但这是我目前发现的:
- 在设置
Text属性后的每个PdfTextField上,Elements中都会出现一个/AP元素,其中包含对对象的引用,其中包含应绘制的内容。
我认为 Adobe 可以理解 acroforms 上的 /NeedAppearance 元素,因此使每个字段上的 /AP元素都正确。文件的原因是之后的 kb 变少了,接缝是 Adobe 对元素上的流做一些事情,某种编码,占用更少的空间。
就目前而言,我想我也创建了一个新的 Flatten 方法,该方法可以正确创建 /AP 元素。我不知道为什么当前的Flatten 方法不这样做,因为它只是将字段更改为只读。
【问题讨论】: