【问题标题】:Different result in different pdf viewer pdfsharp不同的pdf查看器pdfsharp的不同结果
【发布时间】: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 元素,其中包含对对象的引用,其中包含应绘制的内容。

我认为 Adob​​e 可以理解 acroforms 上的 /NeedAppearance 元素,因此使每个字段上的 /AP元素都正确。文件的原因是之后的 kb 变少了,接缝是 Adob​​e 对元素上的流做一些事情,某种编码,占用更少的空间。

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

【问题讨论】:

    标签: c# pdf


    【解决方案1】:

    我最终做的是创建自己的 flatten 方法。

    Flatten 方法的作用总结:

    我已经把它扩展为PdfAcroForm

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

    然后我从元素/Rect得到字段的位置和大小

    然后将我的XGraphics 放入XTextFormatter,并通过我的字段元素设置我的XTextFormmater 的外观。

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

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

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

    免责声明:

    我创建的 flatten 方法会删除您的字段,并且您不能撤消它。它在 pdf 本身上写入文本,但只在字段位置上执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-19
      • 2021-04-30
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多