我和我的团队最近从ITextSharp变成了PdfSharp,因为ITextSharp变得非常慢,我们似乎无法解决这个问题。
但是现在我们有一个问题,我们的pdf,由PdfSharp填充,比来自ITextSharp的要大200 is。大小本身并不是问题所在,当我们在firefox中打开pdf时,数据在查看器中仍然显示得很好,但是当我们想要打印它时,所有的多行字段突然变成一行,字体也不同了。
我们在我们的顶体元素上有/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()来使字段readOnly。
--一个小插曲,
一旦我们在adobe中打开pdf,并且我们想关闭它,它希望我们保存它,而不改变文档。一旦我们保存了它,它就少了200 in,并且突然在所有的观众中工作。这是开着/NeedAppearance的。
更新1
我花了一整晚时间来寻找解决方案,但却找不到。但到目前为止,我已经找到了这样的答案:
在设置了每个属性之后,每个PdfTextField上都会有一个/AP元素,该元素包含对对象的引用,该对象包含应该绘制的内容。
我认为Adobe能够理解/NeedAppearance元素,因此每个字段上的/AP元素都是正确的。文件后面的kb较少,是因为Adobe对元素上的流做了一些操作,某种编码方式,从而减少了空间。
因此,就像现在一样,我认为我也创建了一个新的平面方法,它正确地创建了/AP元素。我不知道为什么当前的Flatten方法不这样做,因为它只是将字段更改为只读。
发布于 2021-07-02 17:48:40
最后我要做的是创建我自己的扁平方法。
扁平方法所做工作的总结:
我已经把它扩展到PdfAcroForm了。
我循环遍历所有字段,但PdfChecboxfield除外,因为显示得很好。然后我去找字段所在的页面,并从该页面创建和XGraphics。
然后,从元素/Rect获得字段的位置和大小。
然后将我的XGraphics放入一个XTextFormatter中,并通过字段中的元素在我的XTextFormmater上设置外观。
然后我使用XTextFormatter.Drawstring(),然后,释放我的XGraphics。
然后,为了删除字段,我删除了该字段上的所有元素。
如果你对此不清楚,请发表意见,我会尽力帮助你的。
免责声明:
我创建的扁平化方法,将删除您的字段,您的不能撤消它。它将文本写在pdf上,但只需在字段位置上进行。
https://stackoverflow.com/questions/68179661
复制相似问题