C# iText 7:旋转时生成的戳记打断

C# iText 7:旋转时生成的戳记打断,c#,pdf,rotation,itext,itext7,C#,Pdf,Rotation,Itext,Itext7,我正在尝试使用iTextsharp创建图章-就我而言,生成的图章的位置和大小得到了适当的处理。但是,一旦用户使用读卡器打开文档,尝试旋转戳记只会破坏它。印章变成带有“X”的空白框,如下所示: 我使用的代码如下: Rectangle location = new Rectangle(crop.GetLeft(),crop.GetBottom(),iWidth/4,iHeight/4); PdfStampAnnotation stamp = new PdfStampAnnotation(loc

我正在尝试使用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完成的操作。我假设读者在尝试旋转图像之前,首先旋转并调整边框的大小来尝试旋转

还值得注意的是,缩放和移动戳记确实有效-是否有一个属性我忘记包含在戳记的构造中?

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

说明书 就PDF规范而言,您的方法没有错。它所说的关于邮票注释的一切是

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

表181–特定于橡皮戳批注的附加条目

子类型 名称 (必需)本词典描述的注释类型;对于橡皮图章注释,应为图章

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

批准、试验、未批准、AsIs、过期、不公开发布、机密、最终、出售、部门、供评论、最高机密、草稿、公开发布

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

注释词典的AP条目(如有)应优先于名称条目;见表168和12.5.5,“外观流”

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

Adobe阅读器 因此,这个问题与PDF无关,而是与Adobe Reader实现橡皮戳注释旋转更改的方式有关

我在这方面测试了Adobe Acrobat Reader DC的行为,结果表明,在旋转时,它总是根据自己已知的资源重新创建橡皮戳批注的外观,每当它不知道批注类型时,都使用该X图形。例如,如果更改Adobe Reader创建的标准批注的外观,然后对其进行旋转,则该批注将恢复其Adobe Reader外观

因此,它总是在旋转时重新创建橡皮戳批注的外观,除非它将其识别为自定义、用户定义的戳记并通过以“#”字符开头的名称识别用户定义的戳记

修复 因此,如果你改变

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

生成的PDF应该按需要运行(至少在这里是这样)

注意:由于规范中没有规定此行为,因此它可能随时更改

例如,当我在这里用Adobe Reader创建用户定义的戳记时,它的名称是#zKzrX95V9NYDDQGyrLjmOA。这个名字中可能有校验和字母之类的东西,也可能有外观哈希之类的东西。在这种情况下,Adobe可能会在更高版本中开始只识别橡皮戳批注,而橡皮戳批注也满足用户定义的条件

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

事实并非如此

该规范主要定义特定PDF的显示方式,几乎没有指定如何编辑

特别是上面引用的处方

注释词典的AP条目(如果存在)应优先于名称条目

仅指显示PDF,而不是编辑PDF。

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

说明书 就PDF规范而言,您的方法没有错。它所说的关于邮票注释的一切是

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

表181–特定于橡皮戳批注的附加条目

子类型 名称 (必需)本词典描述的注释类型;对于橡皮图章注释,应为图章

名称 名称 (可选)显示注释时应使用的图标名称
PdfStampAnnotation stamp = new PdfStampAnnotation(location).SetStampName(new PdfName("#Logo"));