1

给定一个已指定字段的 PDF 表单,我希望能够在其中一个表单字段中放置类似的内容:

罗德里戈,你不是父亲!

使用 iTextSharp,我可以使用富文本值完成此操作(尽管有点费力),并根据此答案传入表示具有适当粗体标记的内容的 XML 。

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

前面提到的答案的作者提到,这可以通过“[使用 Javascript] 在打开表单时重置字段值以强制 Acrobat/Reader 为您构建外观 [s] 来解决。

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

此外,这是否允许我们不必说GenerateAppearances = false,从而允许我们锁定和展平表格?

如果没有,除了 iTextSharp 之外,是否还有其他东西可以让我们将表单字段中的某些单词加粗,但也可以锁定和展平表单以防止我们完成后的未来编辑?

4

1 回答 1

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();
}
于 2012-08-31T19:21:52.570 回答