2014-09-10 3 views
0

내 방법은 내가 cannot implicitly convert type system.collections.generic.IList<Itextsharp.text.pdf.acrofields.fieldposition> to float array형식 변환 예외

누군가 어떻게 변환하는 말해 오류가 발생했습니다 라인

float[] fieldPosition = _pdfStamper.AcroFields.GetFieldPositions(field); 

에서

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(); 
     } 
    } 

입니다. 나는 전환에 기초한 나의 모든 논리를 가지고있다.

+2

'플로트 [] FieldPosition와 = _pdfStamper.AcroFields.GetFieldPositions (필드) ALL 기타 사항 서보 -OFF (POS => // float을 반환하는 논리를 수행하십시오.) .ToArray();' –

+0

@SepehrFarshid *'... Select (...)'* - 원래 목록의 각 필드 위치 인스턴스가 * 5 * 수레로 확장 될 수 있습니다. – mkl

+0

그런 다음'SelectMany'를 사용하십시오! : D –

답변

2

당신은 AcroFields.GetFieldPositions 필드 시각화, 페이지, LLX 당 5 개 개의 번호, 에서야, URX, URY의 목록을 반환하는 고대 iTextSharp 버전에서 업그레이드 할 것 같다.

이 구조는 더 구조화 된 디자인으로 변경되었으므로 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); 
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'는 다섯 개의 튜플'page, llx, lly, urx, ury'로 확장되어야합니다. – mkl

+0

@LVBen 저는 이것을 시도했지만 작동하지 않았습니다. 당신은 더 나은 해결책을 줄 수 있습니다. – MaxMini