iTextSharp AcroFields
类有一个GetFieldPosition
方法。
我试图以编程方式修改字段的位置。我想知道为什么没有相应的SetFieldPosition
,或者是否有另一种改变字段大小或位置的方法?
答案 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());
它会在400x100
和100,400
处创建一个500,500
文字字段。 还创建一个带有/AP
和0,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);
}
}
}