【问题标题】:Add signature field on rotated document在旋转的文档上添加签名字段
【发布时间】:2020-02-24 10:20:43
【问题描述】:

我正在尝试在旋转的文档上添加签名字段,但我不想在签名字段上应用旋转,它应该添加到旋转页面上,旋转为 0。

我尝试了以下方法,但它对我不起作用。

page.SetIgnorePageRotationForContent(true);

谁能提供这个问题的解决方案?

签名外观代码sn-p:

    PdfFormXObject layer2Object = _pdfSignatureAppearance.GetLayer2();

    PdfCanvas pdfCanvas = new PdfCanvas(layer2Object, _pdfSigner.GetDocument());
    PdfPage page = _pdfSigner.GetDocument().GetPage(signingRequest.Page <= 0 ? 
    signingRequest.PageNumber : signingRequest.Page);
    page = page.SetIgnorePageRotationForContent(false);
    int pageRotation = page.GetRotation();
    Canvas appearanceCanvas = new Canvas(pdfCanvas, _pdfSigner.GetDocument(), 
    layer2Object.GetBBox().ToRectangle());

    ImageData signatureImageData = 
    ImageDataFactory.Create(signingRequest.SignatureImage);
    Image signatureImage = new Image(signatureImageData);
    signatureImageData.SetRotation(0f);
    ImageData logoImageData = 
    ImageDataFactory.Create(Convert.FromBase64String(signingRequest.Logo));
    Image logoImage = new Image(logoImageData);
 logoImageData.SetRotation(0f);

KeyValuePair<string, SignatureAppearanceField> handSignatureKey = appearanceFieldSettings.Where(o => o.Key == SignatureAppearanceAttributes.HAND_SIGNATURE.ToString()).FirstOrDefault();
 appearanceAttributes = new Paragraph().SetWidth(UnitValue.CreatePercentValue(100)).SetHeight(UnitValue.CreatePercentValue(100)).SetMargin(0.01f).SetStrokeWidth(0.1f);
 handSignatureImage.SetHorizontalAlignment(iText.Layout.Properties.HorizontalAlignment.LEFT);
 handSignatureImage = handSignatureImage.SetAutoScale(true);
 handSignatureImage.SetMarginLeft((handSignatureKey.Value.X / aspectRatio) + 10);
 if (appearanceFieldSettings.ContainsKey("COMPANY_LOGO"))
 {
 if (fieldSettings.Key == SignatureAppearanceAttributes.COMPANY_LOGO.ToString())
 {
 IList<Image> images = new List<Image>();
 KeyValuePair<string, SignatureAppearanceField> companySignatureKey = appearanceFieldSettings.Where(o => o.Key == SignatureAppearanceAttributes.COMPANY_LOGO.ToString()).FirstOrDefault();
 companyLogoImage.SetAutoScale(true);
 companyLogoImage.SetHorizontalAlignment(iText.Layout.Properties.HorizontalAlignment.RIGHT);
 companyLogoImage.SetMarginLeft((companySignatureKey.Value.Width / aspectRatio) - 20);
 images.Add(handSignatureImage);
 images.Add(companyLogoImage);
 appearanceAttributes.AddAll(images);
if (pageRotation > 0)
 {
 handSignatureImage.SetRotationAngle((Math.PI / 180) * pageRotation);
 companyLogoImage.SetRotationAngle((Math.PI / 180) * pageRotation);
 appearanceAttributes.SetRotationAngle((Math.PI / 180) * pageRotation);
 }
appearanceCanvas.Add(appearanceAttributes);
 }
 }
 else
 {
 if (pageRotation > 0)
 {
 handSignatureImage.SetRotationAngle((Math.PI / 180) * pageRotation);
 appearanceAttributes.SetRotationAngle((Math.PI / 180) * pageRotation);
 }
 appearanceAttributes.Add(handSignatureImage);
 appearanceCanvas.Add(appearanceAttributes);
 }

设置签名者和签名原因;

    KeyValuePair<string, SignatureAppearanceField> signingReasonKey = appearanceFieldSettings.Where(o => o.Key == SignatureAppearanceAttributes.SIGNING_REASON.ToString()).FirstOrDefault();
 string reason = !string.IsNullOrEmpty(signingRequest.WitnessReason) ? signingRequest.WitnessReason : signingRequest.SigningReason;
 if (reason.Length > 25)
 reason = reason.Substring(0, 25) + " ...";
 Text signingReasonText = null;
 appearanceAttributes = new Paragraph().SetFontSize(signingReasonKey.Value.Font.FontSize / aspectRatio).SetMargin(0.01f).SetStrokeWidth(0.1f);
 if (signingReasonKey.Value.ShowLabel)
 {
 signingReasonText = new Text(signingReasonKey.Value.LabelName + ": " + reason);
 }
 else
 {
 signingReasonText = new Text(reason);
 }
if (pageRotation > 0)
 {
 appearanceAttributes.SetRotationAngle((Math.PI / 180) * pageRotation);
 }
appearanceAttributes.Add(signingReasonText);
 appearanceCanvas.Add(appearanceAttributes);

【问题讨论】:

  • SetIgnorePageRotationForContent 允许忽略 content 的页面旋转,但签名可视化不是 content 而是 annotations。如何旋转签名可视化以抵消观察到的效果?
  • @mkl 我已在此处附上发布的文档:1drv.ms/b/s!AvIgyv7xAxxoihVIJBafez7kcmQ3?e=u2GBOy 我正在使用图像和段落创建自定义签名外观并将它们添加到 layout.Canvas。我也尝试过使用 180 度和 270 度旋转文档的解决方案,但文本也没有在这些旋转中调整。你能否在这方面指导我。谢谢
  • “但文本没有在这些旋转中调整” - 你到底是什么意思?
  • @mkl 请看下图进一步解决问题1drv.ms/u/s!AvIgyv7xAxxoihYM0vmgBl-vy81p?e=hfF4Ro
  • 在该图像中,您显示旋转文档上的错误外观非旋转文档上呈现的正常外观,但不是所需旋转文档上的外观。如果你也能画出它会很棒,特别是关于它的旋转和它的内容。 (顺便说一句,我刚刚将您的图片添加到您的问题中。)

标签: c# .net pdf itext7


【解决方案1】:

我使用了您的示例文件中的修订版,它有两个空的签名字段并且尚未签名。此外,我使用了您签名图像的重建版本。

使用 iText 默认外观

作为第一次检查,我应用了常规 iText 签名代码,其中 iText 本身填充了签名的外观:

using (PdfReader pdfReader = new PdfReader(PDF_SOURCE))
{
    PdfSigner pdfSigner = new PdfSigner(pdfReader, File.Create(PDF_DEST), new StampingProperties().UseAppendMode());
    ImageData imageData = ImageDataFactory.Create(IMAGE_SOURCE);

    pdfSigner.SetFieldName("SH_SIGNATURE_417868");

    PdfSignatureAppearance sigAppearance = pdfSigner.GetSignatureAppearance();
    sigAppearance.SetContact("ContactInfo");
    sigAppearance.SetLocation("Location");
    sigAppearance.SetReason("SigningReason");
    sigAppearance.SetLayer2Text("Muddassir Awan");
    sigAppearance.SetSignatureGraphic(imageData);
    sigAppearance.SetRenderingMode(RenderingMode.GRAPHIC_AND_DESCRIPTION);
    sigAppearance.SetSignatureCreator("Muddassir Awan");

    int estimatedSize = 12000;
    pdfSigner.SignExternalContainer(new ExternalBlankSignatureContainer(PdfName.Adobe_PPKLite, PdfName.Adbe_pkcs7_detached), estimatedSize);
}

结果:

因此,这行得通。

但显然,您希望数据以不同的方式排列,因此我们必须尝试在本质上与 iText 的外观生成代码相同,只是组件的排列方式不同。

使用自定义外观

由于 iText 代码有效(如上所示)并且您的代码引用了许多我在这里没有的变量,因此我从头开始编写此代码,从 iText 借用代码(更准确地说是PdfSignatureAppearance.GetAppearance()),旨在为非旋转文档创建与您的屏幕截图有些相似的外观:

using (PdfReader pdfReader = new PdfReader(PDF_SOURCE))
{
    PdfSigner pdfSigner = new PdfSigner(pdfReader, File.Create(PDF_DEST), new StampingProperties().UseAppendMode());

    ImageData signatureImageData = ImageDataFactory.Create(IMAGE_SOURCE);
    Image signatureImage = new Image(signatureImageData);

    pdfSigner.SetFieldName("SH_SIGNATURE_417868");

    PdfSignatureAppearance sigAppearance = pdfSigner.GetSignatureAppearance();
    sigAppearance.SetContact("ContactInfo");
    sigAppearance.SetLocation("Location");
    sigAppearance.SetReason("SigningReason");
    sigAppearance.SetSignatureCreator("Muddassir Awan");

    PdfPage page = pdfSigner.GetDocument().GetPage(sigAppearance.GetPageNumber());
    int rotation = page.GetRotation();

    PdfFormXObject layer2Object = sigAppearance.GetLayer2();
    Rectangle rect = layer2Object.GetBBox().ToRectangle();
    PdfCanvas pdfCanvas = new PdfCanvas(layer2Object, pdfSigner.GetDocument());

    if (rotation == 90)
        pdfCanvas.ConcatMatrix(0, 1, -1, 0, rect.GetWidth(), 0);
    else if (rotation == 180)
        pdfCanvas.ConcatMatrix(-1, 0, 0, -1, rect.GetWidth(), rect.GetHeight());
    else if (rotation == 270)
        pdfCanvas.ConcatMatrix(0, -1, 1, 0, 0, rect.GetHeight());

    Rectangle rotatedRect = 0 == (rotation / 90) % 2 ? new Rectangle(rect.GetWidth(), rect.GetHeight()) : new Rectangle(rect.GetHeight(), rect.GetWidth());
    Canvas appearanceCanvas = new Canvas(pdfCanvas, pdfSigner.GetDocument(), rotatedRect);

    Paragraph text = new Paragraph();
    text.SetFontSize(7).Add("Signed by: Muddassir Awan\nReason: I approve this document\nSigned at: 2020-02-20 16:55:20 +05:00");
    appearanceCanvas.Add(text);

    signatureImage.ScaleToFit(rotatedRect.GetWidth(), 40);
    appearanceCanvas.Add(signatureImage);

    int estimatedSize = 12000;
    pdfSigner.SignExternalContainer(new ExternalBlankSignatureContainer(PdfName.Adobe_PPKLite, PdfName.Adbe_pkcs7_detached), estimatedSize);
}

结果:

这大概是你想要的,除了位置微调。

因此只需对PdfCanvas 应用旋转变换以抵消页面旋转,然后根据该旋转选择Canvas 矩形。

【讨论】:

  • 感谢您的回复。我将等待您对 USING CUSTOM SIGNATURE 部分的回复。
  • 非常感谢您的解决方案。它就像一个魅力:)。我遇到的一件事是,270 度和 90 度旋转文档的最终外观感觉像是缩小了。我试图通过更改宽度和高度值来解决这个问题,但问题没有解决。作为参考,我在问题中附上了一张图片。您能否在这种情况下指导我。问候
  • 我会在下周调查。
  • 我看了你的新屏幕截图。我不明白您对它们的“感觉像缩小了” 是什么意思。你可以解释吗?可能是通过在这些屏幕截图上展示您所期望的草图来代替?
  • 我认为在应用您提供的解决方案后,签名外观呈现为所需的结果,但签名外观内容远小于签名字段大小,如图所示我附上的图像。黑色边框是签名字段的大小,如果看到签名外观内容,它比字段大小要小得多,而不是根据字段大小来拟合。问候
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多