1

フィールドがすでに指定されているPDFフォームがある場合、フォームフィールドの1つに次のようなものを入力できるようにしたいと思います。

ロドリゴ、あなたは父親ではありません!

iTextSharpを使用すると、リッチテキスト値を使用し、この回答のように適切な太字のマークアップでコンテンツを表すXMLを渡すことで、これを(少し骨の折れる作業ではありますが)実現できます。

ただし、同じ答え(および私の直接の経験)によると、これを行った後は、フォームをロック+フラット化することはできません(それ以上の編集を防ぐため)。残念ながら、この場合もそれが必要です。

前述の回答の作成者は、これは「[Javascriptを使用して]フォームを開いたときにフィールド値をリセットしてAcrobat/Readerに外観を強制的に構築させる」ことで回避できる可能性があると述べています。

PDFにJavascriptコードを追加するにはどうすればよいですか(ファイル自体のバックエンドで実行できる場合もありますが、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 に答える