不同的pdf查看器产生不同的结果pdfsharp
Different result in different pdf viewer pdfsharp
我和我的团队最近从 ITextSharp 更改为 PdfSharp,因为 ITextSharp 变得非常慢,我们似乎无法解决问题。
但是现在我们遇到了一个问题,我们的 pdf(由 PdfSharp 填充)比来自 ITextSharp 的 pdf 大 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
on.
更新 1
我整晚都在寻找解决方案,但没有找到。
但这是我到目前为止发现的:
- 在设置
Text
属性 之后的每个 PdfTextField
中,Elements
中都会出现一个 /AP
元素,其中包含对对象的引用, 其中包含应绘制的内容。
我认为 Adobe 可以理解 acroforms 上的 /NeedAppearance
元素,因此使每个字段上的 /AP
元素都是正确的。文件变小的原因是 Adobe 对元素上的流做了一些处理,某种编码,减少了 space.
所以现在,我想我也创建了一个新的 Flatten 方法来正确创建 /AP
元素。我不知道为什么当前的 Flatten
方法不这样做,因为它只是将字段更改为只读。
我最后做的是创建我自己的展平方法。
Flatten 方法的作用总结:
我已经把它扩展到 PdfAcroForm
。
我遍历所有字段,除了 PdfChecboxfield
,因为它显示得很好。
然后我找到了该字段所在的页面,并从该页面创建并XGraphics
。
然后我从元素 /Rect
中获取字段的位置和大小
然后把我的XGraphics
放在一个XTextFormatter
中,然后根据我的字段元素设置我的XTextFormmater
的外观。
然后我使用 XTextFormatter.Drawstring()
然后处理我的 XGraphics
.
然后为了删除该字段,我删除了该字段上的所有元素。
如果您不清楚,请随时发表评论,我会尽力帮助您。
免责声明:
我创建的展平方法将删除您的字段,并且您无法撤消它。它在 pdf 本身上写文本,但只是在字段位置上写。
我和我的团队最近从 ITextSharp 更改为 PdfSharp,因为 ITextSharp 变得非常慢,我们似乎无法解决问题。
但是现在我们遇到了一个问题,我们的 pdf(由 PdfSharp 填充)比来自 ITextSharp 的 pdf 大 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
on.
更新 1
我整晚都在寻找解决方案,但没有找到。 但这是我到目前为止发现的:
- 在设置
Text
属性 之后的每个PdfTextField
中,Elements
中都会出现一个/AP
元素,其中包含对对象的引用, 其中包含应绘制的内容。
我认为 Adobe 可以理解 acroforms 上的 /NeedAppearance
元素,因此使每个字段上的 /AP
元素都是正确的。文件变小的原因是 Adobe 对元素上的流做了一些处理,某种编码,减少了 space.
所以现在,我想我也创建了一个新的 Flatten 方法来正确创建 /AP
元素。我不知道为什么当前的 Flatten
方法不这样做,因为它只是将字段更改为只读。
我最后做的是创建我自己的展平方法。
Flatten 方法的作用总结:
我已经把它扩展到 PdfAcroForm
。
我遍历所有字段,除了 PdfChecboxfield
,因为它显示得很好。
然后我找到了该字段所在的页面,并从该页面创建并XGraphics
。
然后我从元素 /Rect
然后把我的XGraphics
放在一个XTextFormatter
中,然后根据我的字段元素设置我的XTextFormmater
的外观。
然后我使用 XTextFormatter.Drawstring()
然后处理我的 XGraphics
.
然后为了删除该字段,我删除了该字段上的所有元素。
如果您不清楚,请随时发表评论,我会尽力帮助您。
免责声明:
我创建的展平方法将删除您的字段,并且您无法撤消它。它在 pdf 本身上写文本,但只是在字段位置上写。