类型转换异常

时间:2014-09-10 07:02:11

标签: c# pdf itextsharp

我的方法是

 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

有人告诉我如何转换。我的所有逻辑都基于转换。

2 个答案:

答案 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();