类型转换异常



我的方法是

 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

有人告诉我如何皈依。我所有的逻辑都建立在转换的基础上。

您似乎是从一些古老的iTextSharp版本升级而来,在该版本中,AcroFields.GetFieldPositions返回了每个字段可视化、page、llx、lly、urx、ury的5个数字的列表。

同时,这已经改为更结构化的设计,您现在可以获得一个FieldPosition实例,该实例具有int页面成员和Rectangle成员。

当然,你可以将其转换回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);
  float[] fieldPosition = _pdfStamper.AcroFields.GetFieldPositions(field)
     .SelectMany(fp => new[] { fp.position.X, fp.position.Y, fp.position.Width, fp.position.Height })
     .ToList();

相关内容

最新更新