我的方法是
private void _fillText(string field, List<TextPart> parts, int alignment)
{
//fieldPosition: page, llx, lly, urx, ury
float[] fieldPosition = _pdfStamper.AcroFields.GetFieldPositions(field);
PdfContentByte pdfContentByte = _pdfStamper.GetOverContent(fieldPosition[0]);
foreach (TextPart tp in parts)
{
ColumnText myColumn = new ColumnText(pdfContentByte);
myColumn.RunDirection = _runDirection;
//if (_runDirection == PdfWriter.RUN_DIRECTION_RTL)
// tp.Font = _arialBlackFont12;
myColumn.SetSimpleColumn(Convert.ToInt32(fieldPosition[1]) + tp.LeftMargin
, fieldPosition[2]
, fieldPosition[3] - tp.RightMargin
, fieldPosition[4] - tp.TopMargin);
Phrase myPhrase = new Phrase(new Chunk(tp.Text));
//myPhrase.Font = font;
Paragraph myParagraph = new Paragraph();
myParagraph.Font = tp.Font;
myParagraph.Font.SetStyle(tp.FontStyle);
if (tp.Font == _lucidaSansGray60Font9)
myParagraph.Leading = 10;
if (tp.Leading != null)
myParagraph.Leading = tp.Leading.Value;
myParagraph.Alignment = alignment;
myParagraph.Add(myPhrase);
myColumn.AddElement(myParagraph);
myColumn.Go();
}
}
在第
行float[] fieldPosition = _pdfStamper.AcroFields.GetFieldPositions(field);
我收到错误cannot implicitly convert type system.collections.generic.IList<Itextsharp.text.pdf.acrofields.fieldposition> to float array
有人告诉我如何转换。我的所有逻辑都基于转换。
答案 0 :(得分:2)
您似乎从一些古老的iTextSharp版本升级,其中AcroFields.GetFieldPositions
每个字段可视化,页面,llx,lly,urx,ury返回了5个数字的列表。
此时已更改为更结构化的设计,您现在可以获得一个具有int
页面成员和Rectangle
成员的FieldPosition实例。
当然,您可以将此转换回Sepehr Farshid在他的评论中提出的旧结构,并由LVBean在他的新答案中尝试。但是,为了获得更好的源代码质量,您可以考虑使用新的FieldPosition
对象。
这相当于(仅在编辑器中转换,轻微错误可能会持续存在):
FieldPosition fieldPosition = _pdfStamper.AcroFields.GetFieldPositions(field)[0];
PdfContentByte pdfContentByte = _pdfStamper.GetOverContent(fieldPosition.page);
foreach (TextPart tp in parts)
{
ColumnText myColumn = new ColumnText(pdfContentByte);
myColumn.RunDirection = _runDirection;
myColumn.SetSimpleColumn(Convert.ToInt32(fieldPosition.position.Left) + tp.LeftMargin
, fieldPosition.position.Bottom
, fieldPosition.position.Right - tp.RightMargin
, fieldPosition.position.Top - tp.TopMargin);
答案 1 :(得分:0)
float[] fieldPosition = _pdfStamper.AcroFields.GetFieldPositions(field)
.SelectMany(fp => new[] { fp.position.X, fp.position.Y, fp.position.Width, fp.position.Height })
.ToList();