不同的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

我整晚都在寻找解决方案,但没有找到。 但这是我到目前为止发现的:

我认为 Adob​​e 可以理解 acroforms 上的 /NeedAppearance 元素,因此使每个字段上的 /AP 元素都是正确的。文件变小的原因是 Adob​​e 对元素上的流做了一些处理,某种编码,减少了 space.

所以现在,我想我也创建了一个新的 Flatten 方法来正确创建 /AP 元素。我不知道为什么当前的 Flatten 方法不这样做,因为它只是将字段更改为只读。

我最后做的是创建我自己的展平方法。

Flatten 方法的作用总结:

我已经把它扩展到 PdfAcroForm

我遍历所有字段,除了 PdfChecboxfield,因为它显示得很好。 然后我找到了该字段所在的页面,并从该页面创建并XGraphics

然后我从元素 /Rect

中获取字段的位置和大小

然后把我的XGraphics放在一个XTextFormatter中,然后根据我的字段元素设置我的XTextFormmater的外观。

然后我使用 XTextFormatter.Drawstring() 然后处理我的 XGraphics.

然后为了删除该字段,我删除了该字段上的所有元素。

如果您不清楚,请随时发表评论,我会尽力帮助您。

免责声明:

我创建的展平方法将删除您的字段,并且您无法撤消它。它在 pdf 本身上写文本,但只是在字段位置上写。