C# iText,打印时签名不可见

问题描述 投票:0回答:1

我在c#中使用iText.kernel,我创建签名字段(通过将所有矩形属性设置为0来+1隐形签名),我签名并保存pdf。当我打开 pdf 时,我看到所有应该可见的签名,但当我想打印时,所有签名都是不可见的!我不知道我的代码有什么问题。

我使用此代码来创建签名字段:

PdfSignatureFormField newSignField = PdfSignatureFormField.CreateSignature(pdfDoc, new Rectangle(pdfFieldInfos.FieldX, pdfFieldInfos.FieldY, pdfFieldInfos.FieldWidth, pdfFieldInfos.FieldHeight));
newSignField.SetBackgroundColor(iText.Kernel.Colors.ColorConstants.WHITE);
newSignField.SetBorderColor(iText.Kernel.Colors.ColorConstants.BLACK);
newSignField.SetFieldName(pdfFieldInfos.FieldName);
form.AddField(newSignField, pdfDoc.GetPage(pdfFieldInfos.FieldPage));

我用这个代码签名:

var pdfSignatureFieldInfos = pdfExistingSignatureFieldsInfos[i];
using (MemoryStream srcMemStream = new MemoryStream(filledPDF))
{
  using (MemoryStream memStream = new MemoryStream())
  {
    PdfReader reader = new PdfReader(srcMemStream);
    reader.SetUnethicalReading(true); // bypass encryption

    // Open PDF in stamping mode and will be edited in append mode.
    PdfSigner signer = new PdfSigner(reader, memStream, new StampingProperties().UseAppendMode());

    //// Créez l’aspect de la signature.
    Rectangle rect = new Rectangle(pdfSignatureFieldInfos.FieldX, pdfSignatureFieldInfos.FieldY, pdfSignatureFieldInfos.FieldWidth, pdfSignatureFieldInfos.FieldHeight);


    // Creating the appearance
    PdfSignatureAppearance appearance = signer.GetSignatureAppearance();
    appearance
      .SetPageRect(rect)
      .SetPageNumber(pdfSignatureFieldInfos.FieldPage);

    if (pdfSignatureFieldInfos.FieldReason != null)
    {
      appearance.SetReason(pdfSignatureFieldInfos.FieldReason);
    }

    if (pdfSignatureFieldInfos.FieldLocation != null)
    {
      appearance.SetLocation(pdfSignatureFieldInfos.FieldLocation);
    }

    if (pdfSignatureFieldInfos.FieldSignatureCreator != null)
    {
      appearance.SetSignatureCreator(pdfSignatureFieldInfos.FieldSignatureCreator);
    }

    if (pdfSignatureFieldInfos.FieldContact != null)
    {
      appearance.SetContact(pdfSignatureFieldInfos.FieldContact);
    }                

    // If there is no image like invisible signature avoiding this part
    if (pdfSignatureFieldInfos.FieldValue != null)
    {
      byte[] imageBinaries = Convert.FromBase64String(pdfSignatureFieldInfos.FieldValue);
      ImageData img = ImageDataFactory.Create(imageBinaries);
      appearance
        .SetRenderingMode(PdfSignatureAppearance.RenderingMode.GRAPHIC)
        .SetSignatureGraphic(img);
    }

    if (isFirstRecipientToSign && i == 0) // The first recipient to sign and first recipient signature img => add the certification signature
    {
      signer.SetCertificationLevel(PdfSigner.CERTIFIED_FORM_FILLING);
    }
    else
    {
      signer.SetCertificationLevel(PdfSigner.NOT_CERTIFIED);
    }

    signer.SetFieldName(pdfSignatureFieldInfos.FieldName);


    // Creating the signature
    IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm);

    ITSAClient tsaClient = new TSAClientBouncyCastle("http://timestamp.digicert.com", "", ""); // Setting a timestamp for signature
    signer.SignDetached(pks, chain, null, null, tsaClient, 0, subfilter);

    reader.Close();

    filledPDF = memStream.ToArray();
  }
}
c# pdf itext digital-signature itext7
1个回答
0
投票

感谢您的注释,我通过使用以下方法解决了它:

newSignField.SetVisibility(PdfSignatureFormField.VISIBLE);

© www.soinside.com 2019 - 2024. All rights reserved.