2014-09-10 3 views
0

мой методтип исключения преобразования

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

'всплывают [] fieldPosition = _pdfStamper.AcroFields.GetFieldPositions (поле) .Select (поз => // Сделайте некоторую логику для возврата float) .ToArray(); ' –

+0

@SepehrFarshid *' ... Select (...) '* - к сожалению, это не совсем так просто, потому что каждый экземпляр позиции поля в исходном списке должен был бы быть расширенным до * пяти * поплавков. – mkl

+0

Затем используйте 'SelectMany'! : D –

ответ

2

Вы, кажется, обновить какой-то древней iTextSharp версии, в которой AcroFields.GetFieldPositions возвращающего список из 5 номеров в визуализации поля, страницы, LLX, LLY, URX, Ури.

Это время было изменено на более структурированный дизайн, теперь вы получаете один экземпляр 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); 
0
float[] fieldPosition = _pdfStamper.AcroFields.GetFieldPositions(field) 
    .SelectMany(fp => new[] { fp.position.X, fp.position.Y, fp.position.Width, fp.position.Height }) 
    .ToList(); 
+0

, что будет изложением X и Y, если я его использую. LVBen – MaxMini

+1

@LVBen Вы забыли номер начальной страницы. Каждый 'fp' должен быть расширен до страницы с пятью кортежами, llx, lly, urx, ury' – mkl

+0

@LVBen Я пробовал это, но не работал. Можете ли вы дать мне лучшее решение. – MaxMini