2017-07-29 49 views
-1

我使用itext sharp來即時創建PDF。我正在使用ColumnText,因爲我正在處理從右到左的內容。通過搜索網頁,我明白那個column.SetSimpleColumn是接受4 args(x,y,w,h)對不對?我的第一個問題是,我不知道列的寬度和高度,我需要它是由文本內容動態的。任何人有一個想法如何根據他的內容設置列的寬度和高度?以絕對點位置列文本itext sharp

try 
     { 
      for (int j = 0; j < project.Slides[i].Labels.Count; j++) 
      { 
       string pageContext = project.Slides[i].Labels[j].Text; 
       int fontNumber = Convert.ToInt32(project.Slides[i].Labels[j].Font); 
       int fontSize = Convert.ToInt32(project.Slides[i].Labels[j].Size); 
       float fontSizePoints = (float)fontSize * (float)2.3; 
       string fontColor = project.Slides[i].Labels[j].Color; 
       float fontX = (float)project.Slides[i].Labels[j].X; 
       float fontY = (float)project.Slides[i].Labels[j].Y; 
       var color = System.Drawing.ColorTranslator.FromHtml(fontColor); 

       baseFont = GetBaseFont(fontNumber); 

       float w = baseFont.GetWidthPoint(pageContext, fontSizePoints); 
       Font dFont = new Font(baseFont, fontSizePoints); 


       dFont.Color = new BaseColor(color); 
       ColumnText column = new ColumnText(writer.DirectContent); 
       column.SetSimpleColumn(fontX, fontY, w, 100); 

       column.RunDirection = PdfWriter.RUN_DIRECTION_RTL; 
       column.AddElement(new Paragraph(pageContext, dFont)); 

       column.Go(); 
      } 
     } 
     catch (Exception) 
     { 

     } 

我附上圖像來描述問題。文檔中可以有一個或20個文本列。我不知道這個字體的大小和這個文本有多長。它可以是2個字或30個字。我唯一的信息是左邊的x,y |底部座標(和字體系列,大小,顏色...)我的問題是如何創建TextColumn(需要使用這個,因爲RTL支持),並將其放置在特定的座標位置。 enter image description here

+0

我試圖用浮動W = baseFont.GetWidthPoint(pageContext中,fontSizePoints);但它沒有給我正確的寬度。上下文正在破壞 – Elidotnet

+0

我會升級到iText 7並使用pdfCalligraph。這樣,你會避免這樣的問題。正如我在回答您之前發佈的問題時所寫的那樣,在iText 7之前的版本中對從右到左的支持是相當有限的,iText 5處於維護模式,這意味着我們不會在iText 5上進行主動開發了。 iText 5不需要現成的支持,因此無論是你自己擴展iText 5還是切換到iText 7。 –

+0

@BrunoLowagie我知道你是itextsharp解決方案的最大希望而且你比其他人更瞭解這個圖書館,這是我對這個項目的最後一個問題。所有的項目都是使用itext 5構建的,現在將會覆蓋所有項目代碼。必須有一些方法來完成這個問題 – Elidotnet

回答

0

@mkl謝謝你的回覆。我發現的最佳解決方案是。在絕對位置+ RTL支持下工作得很好。

try 
     { 
      for (int j = 0; j < project.Slides[i].Labels.Count; j++) 
      { 
       string pageContext = project.Slides[i].Labels[j].Text; 
       int fontNumber = Convert.ToInt32(project.Slides[i].Labels[j].Font); 
       int fontSize = Convert.ToInt32(project.Slides[i].Labels[j].Size); 
       float fontSizePoints = (float)fontSize * (float)2.1; 
       string fontColor = project.Slides[i].Labels[j].Color; 

       float X = (float)project.Slides[i].Labels[j].X; 
       float Y = pHeightPoints - (float)project.Slides[i].Labels[j].Y; 
       float width = (float)project.Slides[i].Labels[j].Widht; 
       float height = (float)project.Slides[i].Labels[j].Heigh; 

       float llx = X; 
       float lly = Y + height; 
       float urx = X + width; 
       float ury = Y; 

       var color = System.Drawing.ColorTranslator.FromHtml(fontColor); 

       baseFont = GetBaseFont(fontNumber); 
       float w = baseFont.GetWidthPoint(pageContext, fontSizePoints); 
       Font dFont = new Font(baseFont, fontSizePoints); 
       dFont.Color = new BaseColor(color); 

       PlaceText(writer.DirectContent, pageContext, 
        new Font(baseFont, fontSizePoints, 
         Font.NORMAL, 
         new BaseColor(color)), llx, lly, urx, ury, 14, 
         Element.ALIGN_RIGHT); 
      } 
     } 
     catch (Exception) 
     { 

     } 

和...

protected static void PlaceText(PdfContentByte pdfContentByte 
          , string text 
          , iTextSharp.text.Font font 
          , float lowerLeftx 
          , float lowerLefty 
          , float upperRightx 
          , float upperRighty 
          , float leading 
          , int alignment) 
{ 
    ColumnText ct = new ColumnText(pdfContentByte); 
    ct.RunDirection = PdfWriter.RUN_DIRECTION_RTL; 
    ct.SetSimpleColumn(new Phrase(text, font), lowerLeftx, lowerLefty, upperRightx, upperRighty, leading, alignment); 
    ct.Go(); 
} 

感謝

+0

float w = baseFont.GetWidthPoint(pageContext,fontSizePoints);沒有被使用 – Elidotnet