当前位置: 首页 > 知识库问答 >
问题:

如何在iText签名戳中添加自定义字段?

杨星纬
2023-03-14

我有一个简单的签名方法来签署工作正常的PDF文档,它使用显示名称、位置、日期和原因的默认戳记来签署文档。

现在我的经理问我是否可以在上面再添加一个字段。让我们假设这是一个“电子邮件”字段,因为我还没有被告知他们想要什么。

我试着搜索并应用我找到的一些东西,但没有任何效果。

此外,有人问我是否可以删除/隐藏这4个默认字段的标签(日期、原因等...),我无法管理这样做,也找不到任何关于它的东西,我不知道它是否真的可以自定义。

在这里,我将展示她的签名过程是如何工作的。在中间部分,我在iText站点上找到了一些代码,并试图使用这些代码添加“新字段”,但没有显示任何与默认标记不同的结果。

public String signPdfFirstTime(String src, String dest, PrivateKey pk, Certificate[] chain, String providerName, String conteudoBase64, X509Certificate cert) throws IOException, DocumentException, GeneralSecurityException {

    byte[] content = Base64.decode(conteudoBase64);

    FileOutputStream fos = new FileOutputStream(path + File.separator + src);
    fos.write(content );
    fos.close();

    File f = new File(path + File.separator + src);

    FileInputStream in = new FileInputStream(f);

    PdfReader reader = new PdfReader(in);

    FileOutputStream os = new FileOutputStream(path + File.separator + dest);
    PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
    // Creating the appearance
    PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
    appearance.setReason("SOME REASON");
    appearance.setLocation("SOMEWHERE");
    //  appearance.getAppearance().curveFromTo(98, 120, 46, 94);
    Rectangle rectangle = new Rectangle(0, 0, 500, 70);

    appearance.setVisibleSignature(rectangle, 1, "SIGNATURE");

    //Here I trid to add fields to the stamp
    //NOT WORKING AS I EXPECTED...
    PdfWriter writer = stamper.getWriter();
    PdfFormField field = PdfFormField.createEmpty(writer);
    field.setFieldName("TEST 1111");
    TextField name = new TextField(writer,rectangle, "TEST 2222");
    PdfFormField personal_name = name.getTextField();
    field.addKid(personal_name);
    TextField password = new TextField(writer, rectangle, "password");
    PdfFormField personal_password = password.getTextField();
    field.addKid(personal_password);
    stamper.addAnnotation(field, 1);

    appearance.setCertificate(cert);
    // Creating the signature
    ExternalSignature pks = new PrivateKeySignature(pk, DigestAlgorithms.SHA256, providerName);
    ExternalDigest digest = new BouncyCastleDigest();
    List<CrlClient> crlList = new ArrayList<CrlClient>();
    crlList.add(new CrlClientOnline());

    LtvVerification v = stamper.getLtvVerification();

    OcspClient ocspClient = new OcspClientBouncyCastle();

    String url = CertificateUtil.getCRLURL(cert);
    CertificateFactory cf = CertificateFactory.getInstance("X.509");

    X509CRL crl = (X509CRL) cf.generateCRL(new URL(url).openStream());
    System.out.println("CRL valid until: " + crl.getNextUpdate());
    System.out.println("Certificate revoked: " + crl.isRevoked(chain[0]));

    if (crl.isRevoked(chain[0])) {

        throw new GeneralSecurityException("CERTIFICADO REVOGADO!");
    }
    else {
        MakeSignature.processCrl(cert, crlList);

        MakeSignature.signDetached(appearance, digest, pks, chain, null, null, null, 0, CryptoStandard.CMS);
        os.close();
        byte[] b = this.read(f);
        return Base64.encodeBytes(b);
    }
}

共有1个答案

颜嘉誉
2023-03-14

PdfSignature外观类允许您通过以下方式设置自动生成外观的文本

/**
 * Sets the signature text identifying the signer.
 * @param text the signature text identifying the signer. If <CODE>null</CODE> or not set
 * a standard description will be used
 */
public void setLayer2Text(String text)

使用的字体可以使用

/**
 * Sets the n2 and n4 layer font. If the font size is zero, auto-fit will be used.
 * @param layer2Font the n2 and n4 font
 */
public void setLayer2Font(Font layer2Font)

如果你更想控制外观,你可以检索第2层模板,并在上面设计你想要的任何内容。

/**
 * Gets a template layer to create a signature appearance. The layers can go from 0 to 4,
 * but only layer 0 and 2 will be used if acro6Layers is true.
 * <p>
 * Consult <A HREF="http://partners.adobe.com/asn/developer/pdfs/tn/PPKAppearances.pdf">PPKAppearances.pdf</A>
 * for further details.
 * @param layer the layer
 * @return a template
 */
public PdfTemplate getLayer(int layer)
 类似资料:
  • 我正在尝试向现有的数字签名pdf(认证签名)中添加一个空签名字段。 我有一个工作流,其中许多用户将签署该文档(批准签名),该文档创建时带有“n”个空签名字段,每个用户一个,我们的应用程序首先应用一个不可见的认证签名,然后每个用户可以在各自的字段中签署该文档,但由于工作流中意外的更改,其他用户可能希望签名,因此,我们希望添加相应的空签名字段,然后应用签名。 我试图将空字段(带有单元格事件的表)添加到

  • 我正在尝试使用iText(sharp,5.5.13版)创建自定义数字签名,用户可以从四个位置(顶部、底部、左侧和右侧)设置图像位置,如下所示: 刚度: 左: 顶部: 底部: 到目前为止,我试着处理签名的第0层,但我认为我做得不对,因为签名细节是在第2层设置的。 然而,这只是设置图像位置的初始草图。在下面的代码中,我加载图像并将其放入一个块中(想法取自此示例) 结果或多或少是预期的,但有两个问题:签

  • 问题内容: 我创建了一个,并希望添加一个不属于我的模型的自定义字段。 我在此处找到了添加其他字段的说明,并尝试了以下操作: 当我添加此字段并调用我的函数时,则此字段不是字典的一部分。包含所有指定的模型字段,除了额外的字段。因此,我无法在覆盖的验证中访问此字段,可以吗? 当我将此字段添加到字段列表中时,如下所示: 然后我得到一个错误,因为它不是我的模型的一部分-正确的是因为我只想为此序列化器添加它。

  • 问题内容: 我想在RoR应用程序中使用几种字体,但是它们的格式主要是.ttf和.otf等。我该如何将这些文件嵌入我的Rails应用程序?即,一旦将它们放入资产文件夹中,将它们嵌入到CSS和/或LESS文件中的语法到底是什么? 编辑:这是我现在拥有的代码: 它似乎对我不起作用。Rails控制台中的输出类似于以下内容: 使用Firebug检查页面时会说: 问题答案: 较大的示例,假设它们直接在资产目录

  • 是否有一个时间格式来指定这样的日期序列到轴在D3和v4?

  • 我使用PdfWriter setEncryption对PDF文档进行了加密/解密。一切正常,解密也正常。 当我为数字签名的PDF文档做同样的事情时,我的数字信息与消息一起损坏(SigDict/Contents非法数据) 是否可以在不影响数字签名信息的情况下加密PDF?