2013-03-13 43 views
2

奇怪的欄柱/頁改變行爲我很新的iText的,並試圖完成以下任務:iText的 - 與ColumnText

  • 讀取本地高清
  • 的文本文件列表安排的文本在2列布局的PDF文件
  • 文件中的每個文本

我開始與MovieColumns1例子(http://itextpdf.com/examples/iia.php?id=64)前加連續編號的指數,結束了與後續荷蘭國際集團代碼:

final float[][] COLUMNS_COORDS = { { 36, 36, 296, 806 }, { 299, 36, 559, 806 } }; 

    Document document = new Document(PageSize.A4); 
    PdfWriter writer = PdfWriter.getInstance(document, resultFile); 
    document.open(); 

    ColumnText ct = new ColumnText(writer.getDirectContent()); 
    ct.setSimpleColumn(COLUMNS_COORDS[0][0], COLUMNS_COORDS[0][1], 
     COLUMNS_COORDS[0][2], COLUMNS_COORDS[0][3]); 

    File textDir = new File("c:/Users/raddatz/Desktop/123/texts/"); 
    File[] files = textDir.listFiles(); 

    int i = 1; 
    int column = 0; 
    for (File file : files) { 
     String text = FileUtils.readFileToString(file, "UTF-8"); 
     float yLine = ct.getYLine(); 
     System.out.println("adding '" + file.getName() + "'"); 

     PdfPCell theText = new PdfPCell(new Phrase(text, new Font(Font.HELVETICA, 10))); 
     theText.setBorder(Rectangle.NO_BORDER); 
     theText.setPaddingBottom(10); 
     PdfPCell runningNumber = new PdfPCell(new Phrase(new DecimalFormat("00").format(i++), new Font(
      Font.HELVETICA, 14, Font.BOLDITALIC, 
      new Color(0.7f, 0.7f, 0.7f)))); 
     runningNumber.setBorder(Rectangle.NO_BORDER); 
     runningNumber.setPaddingBottom(10); 
     PdfPTable table = new PdfPTable(2); 
     table.setWidths(new int[] { 12, 100 }); 
     table.addCell(runningNumber); 
     table.addCell(theText); 
     ct.addElement(table); 
     int status = ct.go(true); 
     if (ColumnText.hasMoreText(status)) { 
      column = Math.abs(column - 1); 
      if (column == 0) { 
       document.newPage(); 
       System.out.println("inserting new page with size :" + document.getPageSize()); 
      } 
      ct.setSimpleColumn(
       COLUMNS_COORDS[column][0], COLUMNS_COORDS[column][1], 
       COLUMNS_COORDS[column][2], COLUMNS_COORDS[column][3]); 
      yLine = COLUMNS_COORDS[column][3]; 
      System.out.println("correcting yLine to: " + yLine); 
     } else { 
      ct.addElement(table); 
     } 
     ct.setYLine(yLine); 
     System.out.println("before adding: " + ct.getYLine()); 
     status = ct.go(false); 
     System.out.println("after adding: " + ct.getYLine()); 
     System.out.println("--------------------------------"); 
    } 

    document.close(); 

在這裏你可以看到的結果是: http://d.pr/f/NEmx

望着生成的PDF我以爲一切工作了罰款的第一頁。

但在第二頁上,你可以看到這個問題(S):

  • 文本#31沒有完全顯示(第一行+指數被切斷/不可視區域)
  • 文本#46沒有完全顯示(前三行+索引被剪切/不在可見區域)

在第3頁上,一切似乎都恢復正常。我真的迷失在這裏。

- 更新(2013年3月14日) -

我現在已經分析了PDF的內容。問題不在於內容在非可見區域顯示,而是內容完全不在PDF中。內容的缺失部分正好適合上一列/頁面。所以看起來像ColumnText.go(真)是操縱之前通過addElement()傳遞的對象。有人能證實這一點嗎?如果是這樣的話:我能做些什麼呢?

- 結束時更新(2013年3月14日) -

期待您的回覆

問候, 斯文

+0

在這裏,你可以找到我的測試文本文件: http://d.pr/f/Lzk0 – tangomann 2013-03-13 14:10:37

回答

3

解決了!一旦ColumnText指示表格不適合當前列,我將用cTextText的新實例重新初始化ct,然後再次添加表格。

換句話說: ColumnText的每個實例正在處理我的文檔的一列。

if (ColumnText.hasMoreText(status) || mediaPoolSwitch) { 
    column = Math.abs(column - 1); 
    if (mediaPoolSwitch) { 
     currentMediaPool = mediapool; 
     column = 0; 
    } 
    if (column == 0) { 
     document.newPage(); 
     writeTitle(writer.getDirectContent(), mediapool.getName()); 
    } 
    ct = new ColumnText(writer.getDirectContent()); 
    ct.addElement(table); 
    ct.setSimpleColumn(
     COLUMNS_COORDS[column][0], COLUMNS_COORDS[column][1], 
     COLUMNS_COORDS[column][2], COLUMNS_COORDS[column][3]); 
    yLine = COLUMNS_COORDS[column][3]; 
    LOG.debug("correcting yLine to: " + yLine); 
} else { 
    ct.addElement(table); 
} 
ct.setYLine(yLine); 
ct.go(); 
+0

遺憾的是它的唯一,我發現如何處理這樣 – 2013-08-29 20:04:02