如何在PDF表单字段*中加粗特定文本,然后使用iTextSharp压缩表单*?

时间:2012-08-31 14:46:03

标签: .net pdf itextsharp rtf

鉴于已经指定了字段的PDF表单,我希望能够在其中一个表单字段中输入这样的内容:

  罗德里戈,你是父亲!

使用iTextSharp,我可以使用Rich Text值并使用相应的粗体标记传递代表内容的XML(尽管有点苦心),按照this answer

但是,根据相同的答案(以及我的第一手经验),在完成此操作后,您无法锁定+展平表单(以防止进一步编辑)。不幸的是,在这种情况下,这也是必要的。

previously-mentioned answer的作者提到,这可能是通过“[有Javascript]重置字段值时可以解决的,当表单打开时强制Acrobat / Reader为你构建外观[s] 。“

如何将Javascript代码添加到PDF中(最好通过iTextSharp本身,尽管我们可能能够在文件本身的后端执行此操作),以便执行打开表单以强制PDF阅读器为您构建外观?

此外,这是否允许我们不必说GenerateAppearances = false因此允许我们锁定并压扁表单?

如果没有,是否有除iTextSharp以外的其他内容,我们可以在表单字段中使用粗体表达某些单词,还可以锁定并展平表单以防止将来编辑完成后再进行编辑? < / p>

1 个答案:

答案 0 :(得分:1)

我发现有一种方法可以实现这个目标,但不是通过任何特别优雅的方式(我知道)。

您这样做的方法是使用iTextSharp 直接在现有表单字段上编写文本字段。

这里的主要警告是,pdf基本上不再成为一种形式,所以如果你需要读取表单字段的内容,你就会被软管化。

另一方面,如果表单字段基本上被用作帮助告诉iTextSharp将文本放在pdf上的简单指南(并且仅用于输出),那么这可能只是起作用。

using (FileStream filestream = new FileStream(outputpath, FileMode.CreateNew, FileAccess.Write))
{
    var stamper = new PdfStamper(reader, filestream);

    var acroFields = stamper.AcroFields;

    string fieldName = "Field Name";
    var fieldPositions = acroFields.GetFieldPositions(fieldName);

    var helveticaBold = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 14);
    var helveticaRegular = FontFactory.GetFont(FontFactory.HELVETICA, 14);

    List<Chunk> chunks = new List<Chunk>();

    chunks.Add(new Chunk("Rodrigo, you are ", helveticaRegular));
    chunks.Add(new Chunk("NOT", helveticaBold));
    chunks.Add(new Chunk(" the father!", helveticaRegular));

    Phrase currentPhrase = new Phrase();

    foreach (Chunk chunk in chunks)
    {
        currentPhrase.Add(chunk);
    }

    foreach (var currentPosition in fieldPositions)
    {
        PdfContentByte currentCanvas = stamper.GetOverContent(currentPosition.page);

        ColumnText currentColumnText = new ColumnText(currentCanvas);

        currentColumnText.SetSimpleColumn(currentPhrase, currentPosition.position.Left,
                                          currentPosition.position.Bottom, currentPosition.position.Right,
                                          currentPosition.position.Top, 13, Element.ALIGN_LEFT);
        currentColumnText.Go();
    }

    stamper.FormFlattening = true;
    stamper.Close();
}