4

既存の Acroform に目次を挿入するプロセスがあり、そのコンテンツを開始する必要がある場所を追跡できます。ただし、そのポイントの下に既存の Acrofields があり、挿入するテーブルの高さに基づいて上下に移動する必要があります。では、アクロフィールドの位置を変更するにはどうすればよいでしょうか。以下は、位置を「取得」するために使用できるコードです...しかし、今度はそれを「設定」できる必要もあります。

....

            // Initialize Stamper ("output" is a MemoryStream object)
            PdfStamper stamper = new PdfStamper(pdf_rdr, output);

            // Get Reference to PDF Document Fields
            AcroFields fields = stamper.AcroFields;

            //call method to get the field's current position
            AcroFields.FieldPosition pos = GetFieldPosition(fields, "txt_footer");

// ** ここでフィールドの新しい位置を明示的に設定する必要があります

            //assuming a call to "RegenerateField" will be required
            fields.RegenerateField(txt_footer);

....

    //helper method for capturing the position of a field
    private static AcroFields.FieldPosition GetFieldPosition(AcroFields fields, string field_nm)
    {

        ////////////////////////////////////////////////////////////////////////////////////
        //get the left margin of the page, and the "top" location for starting positions
        //using the "regarding_line" field as a basis
        IList<AcroFields.FieldPosition> fieldPositions = fields.GetFieldPositions(field_nm);

        AcroFields.FieldPosition pos = fieldPositions[0];

        return pos;

    }
4

1 に答える 1

6

最初に、1 つまたは複数のページでのフィールドとその表現に関するいくつかの情報。PDF フォームには、多数のフィールドを含めることができます。1 つの特定の名前を持つ 1 つの特定のフィールドには 1 つの値と 1 つの値があるという意味で、フィールドには一意の名前があります。フィールドは、フィールド ディクショナリを使用して定義されます。

各フィールドは、ドキュメント内でゼロ、1 つ、または複数の表現を持つことができます。これらの視覚的表現はウィジェット アノテーションと呼ばれ、アノテーション ディクショナリを使用して定義されます。

これを知っているので、質問を言い換える必要があります:特定のフィールドの特定のウィジェット注釈の場所を変更するにはどうすればよいですか?

この質問への回答として、Java でChangeFieldPositionという名前のサンプルを作成しました。それをC#に移植するのはあなた次第です(さらに参照するためにC#の回答をここに投稿できるかもしれません)。

あなたはすでにAcroFieldsインスタンスを持っています:

 AcroFields form = stamper.getAcroFields();

今必要なのはItem、特定のフィールドのインスタンスです (私の例では、 name のフィールドの場合"timezone2"):

    Item item = form.getFieldItem("timezone2");

位置はウィジェット アノテーションのプロパティであるため、そのウィジェットについて に問い合わせる必要がありitemます。次の行では、最初のウィジェット アノテーション ( index を使用0)のアノテーション ディクショナリを取得します。

    PdfDictionary widget = item.getWidget(0);

ほとんどの場合、ウィジェットの注釈は 1 つだけです。各フィールドには視覚的な表現が 1 つだけあります。

注釈の位置は、llx、lly、urx、ury の 4 つの値を持つ配列です。この配列は次のように取得できます。

    PdfArray rect = widget.getAsArray(PdfName.RECT);

次の行では、右上隅の x 値を変更します (インデックス2は urx に対応します)。

    rect.set(2, new PdfNumber(rect.getAsNumber(2).floatValue() - 10f));

その結果、フィールドの幅が 10pt 短くなります。

于 2014-03-10T08:40:50.323 に答える