使用iTextSharp设置AcroField位置

时间:2014-08-15 15:00:54

标签: itextsharp itext

iTextSharp AcroFields类有一个GetFieldPosition方法。

我试图以编程方式修改字段的位置。我想知道为什么没有相应的SetFieldPosition,或者是否有另一种改变字段大小或位置的方法?

1 个答案:

答案 0 :(得分:1)

See this部分原因。实际上没有单数GetFieldPosition,而是复数GetFieldPositions,因为从技术上讲,您可以拥有多个具有相同名称的字段。因此,理论SetFieldPositions需要考虑到这一点,否则可能会删除某些字段。

另一个原因是场地的定义区域并不总是那么简单。拿这个非常简单的代码:

var tf = new TextField(writer, new iTextSharp.text.Rectangle(100, 400, 500, 500), "name");
writer.AddAnnotation(tf.GetTextField());

它会在400x100100,400处创建一个500,500文字字段。 创建一个带有/AP0,0边界框的外观条目400,100,在您点击该字段之前显示您看到的正常外观区域。如果你真的只是通过相应地移动两个角来改变“位置”你就可以了但是因为这个位置实际上只是一个Rectangle所以没有什么能阻止你让它更宽或更高。在这种情况下,此BBox条目也需要更新。这是一个简单的案例,iText可能会通过它。但是,复选框通常至少有两种需要更改的外观状态。还可能存在其他情况,通过传播这些变化可能没有意义。

但是,如果你想重新定位一个字段,它仍然可以完成,但是你要负担得起这个负担。想象一下只有这个单一文本字段的简单PDF:

var tf = new TextField(writer, new iTextSharp.text.Rectangle(100, 400, 500, 500), "name");
tf.Text = "Hi";
tf.BorderColor = BaseColor.BLACK;
tf.BorderWidth = 1;

writer.AddAnnotation(tf.GetTextField());

您可以通过获取实际字段并调整其PdfStamper数组,使用RECT“移动”文本字段。下面的代码。

using (var fs = new FileStream(testFile, FileMode.Create,FileAccess.Write,FileShare.None)) {
    using (var reader = new PdfReader(bytes)) {
        using (var stamper = new PdfStamper(reader, fs)) {

            //Get our name field
            var nameField = reader.AcroFields.GetFieldItem("name");

            //Grab the first widget inside of it (there could be more)
            var w = nameField.GetWidget(0);

            //Grab the bounding array
            var r = w.GetAsArray(PdfName.RECT);

            //Check both of the Y values
            r[1] = new PdfNumber(r.GetAsNumber(1).IntValue - 300);
            r[3] = new PdfNumber(r.GetAsNumber(3).IntValue - 300);


        }
    }
}