【问题标题】:iText 7: Generated Stamp Breaks Upon RotationiText 7:旋转时生成的邮票断裂
【发布时间】:2017-03-27 17:23:10
【问题描述】:

我正在尝试使用 iTextsharp 创建图章 - 就我而言,生成的图章的位置和大小得到了适当的处理。但是,一旦用户使用阅读器打开文档,尝试旋转图章只会破坏它。戳记变成如下图所示的带有“X”的空白框:

我使用的代码如下:

Rectangle location = new Rectangle(crop.GetLeft(),crop.GetBottom(),iWidth/4,iHeight/4);

PdfStampAnnotation stamp = new PdfStampAnnotation(location).SetStampName(new PdfName("Logo"));

PdfFormXObject xObj = new PdfFormXObject(new Rectangle(iWidth, iHeight));
PdfCanvas canvas = new PdfCanvas(xObj, pdfDoc);
canvas.AddImage(img, 0, 0,iWidth, false);
stamp.SetNormalAppearance(xObj.GetPdfObject());

stamp.SetFlags(PdfAnnotation.PRINT);

pdfDoc.GetFirstPage().AddAnnotation(stamp);
pdfDoc.Close();

我很想说图像没有与矩形绑定,最终会在旋转时分开。但是,假设正确创建了图章,这让我感到困惑,因为这是通过 Acrobat 完成的操作。我假设读者在尝试旋转图像之前首先旋转并调整边界矩形的大小来尝试旋转。

另外值得注意的是,缩放和移动图章确实有效 - 是否有我忘记包含在我的图章构造中的属性?

【问题讨论】:

    标签: c# pdf rotation itext itext7


    【解决方案1】:

    预先警告:以下是在 Windows 上仅使用 Adob​​e Acrobat Reader DC 反复试验的结果。不同平台、不同版本以及最有可能不同查看器产品的结果可能会有所不同。

    规范

    就 PDF 规范而言,您的方法没有任何问题。它所说的关于邮票注释的只是

    12.5.6.12 橡皮戳注释

    橡皮图章注释 (PDF 1.3) 显示的文本或图形看起来像是用橡皮图章印在页面上。打开时,它应显示一个包含相关注释文本的弹出窗口。表 181 显示了特定于此类注释的注释字典条目。

    表 181 - 特定于橡皮图章注释的附加条目

    子类型 姓名 (必填) 本词典描述的注解类型;应为 Stamp 用于橡皮图章注释。

    姓名 姓名 (可选) 用于显示注释的图标名称。符合标准的阅读器应至少为以下标准名称提供预定义的图标外观:

    已批准、实验性、未批准、原样、已过期、NotForPublicRelease、机密、最终、已售、部门、ForComment、TopSecret、草稿、ForPublicRelease

    也可能支持其他名称。默认值:草稿。

    注释字典的 AP 条目(如果存在)应优先于 Name 条目;请参见表 168 和 12.5.5,“外观流”。

    您选择的名称徽标不在该枚举中,但毕竟您提供了自定义外观。

    Adobe 阅读器

    因此,此问题与 PDF 无关,而是与 Adob​​e Reader 实现橡皮图章注释旋转更改的方式有关。

    我在这方面测试了 Adob​​e Acrobat Reader DC 的行为,结果证明,在旋转时,它总是从自己已知的资源中重新创建橡皮图章注释的外观,只要它不知道注释就使用那个 X 图形类型。例如。如果您更改由 Adob​​e Reader 创建的标准注释的外观然后旋转它,它会恢复其 Adob​​e Reader 的外观和感觉。

    因此它总是在旋转时重新创建橡皮图章注释的外观除非它识别为自定义的、用户定义的图章!并且它通过它们识别用户定义的图章以“#”字符开头的名称。

    修复

    因此,如果你改变

    PdfStampAnnotation stamp = new PdfStampAnnotation(location).SetStampName(new PdfName("Logo"));
    

    PdfStampAnnotation stamp = new PdfStampAnnotation(location).SetStampName(new PdfName("#Logo"));
    

    生成的 PDF 应该按预期运行(至少在这里是这样)。

    注意:由于规范没有规定这种行为,它可能随时改变。

    例如当我在此处使用 Adob​​e Reader 创建用户定义图章时,它的名称为 #zKzrX95V9NYDDQGyrLjmOA。此名称中可能有校验和字母之类的东西,或者它可能是外观的哈希值或其他东西。在这种情况下,Adobe 可能会在某些更高版本中开始仅识别橡皮图章注释,这些注释也满足用户定义的此条件。

    违反规范?

    您可能想知道这是否违反了上面引用的规范,该规范没有为“用户定义的注释”定义特殊名称。

    不是。

    规范主要定义了一个特定的 PDF 如何显示,它几乎没有指定如何编辑

    特别是上面引用中的处方

    注释字典的 AP 条目(如果存在)应优先于 Name 条目

    仅指显示 PDF,不指编辑。

    【讨论】:

    • 非常感谢您的丰富解释。您的简单更改确实解决了它。看来我也应该在 Adob​​e 端探索 PDF 生成的细微差别,而不仅仅是 iText API。但是,我仍然无法理解,您是如何得出 Adob​​e 会识别带有“#”字符的用户定义图章的结论的。您碰巧知道它会改变读者对邮票的理解——它是否在另一个 PDF 规范中有所描述?
    • @AAS.N “你是怎么得出结论的……” - 反复试验。实际上,我从查看带有 Adob​​e 生成的常规图章的 PDF 开始,并逐步将其更改为像 iText 生成的一样构建,但后者似乎没有重要的缺失条目。然后我用 Adob​​e 创建了一个自定义图章来玩弄它,过了一段时间我才发现它的特殊名称。我将原始名称复制到您的代码中,然后它突然起作用了。最后我检查了它是否可能只是前导的'#'。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多