2017-11-20 33 views
0

私はPDFBoxを使用してJavaでPDFファイルを作成しようとしていますにBoxableとPDFBoxを使用してPDFファイルに大きなテーブルをレンダリング。このファイルには、2列の大きな表が含まれています。テーブルをPDF内にレンダリングするには、別のライブラリ:boxableを使用しています。javaの

ファイルが正常に作成され、テーブルもレンダリングされます。しかし、行の1つに大きなデータが含まれていると問題が発生します。その場合、テーブルは、分割してデータを適切に表示されない:最初のページが空のまま

enter image description hereenter image description hereenter image description hereenter image description here

大行が新しいページに自動的に移動されます。 2番目のページでは、行が突然終了しますセルにデータ全体を表示せずに、テスト用に新規タスクを入力してを入力しました。 これは再発問題であり、このケースに固有の問題ではありません。

Row<PDPage> headerRow; 
Row<PDPage> row; 
Cell<PDPage> cell; 
int i; 

headerRow = table.createRow(15f); 

cell = headerRow.createCell(30, "Goal Category"); 
cell.setFont(PDType1Font.HELVETICA); 
cell.setFontSize(11); 
cell = headerRow.createCell(70, "My Goal"); 
cell.setFont(PDType1Font.HELVETICA); 
cell.setFontSize(11); 
table.addHeaderRow(headerRow); 

for(i=0;i<goals.size();i++) 
{ 
    ArrayList<String> goal=goals.get(i); 
    row = table.createRow(12); 
    cell = row.createCell(30, goal.get(0)); 
    cell.setFont(PDType1Font.HELVETICA); 
    cell.setFontSize(11); 
    System.out.println("My Goal="+goal.get(1)); 
    cell = row.createCell(70, goal.get(1)); 
    cell.setFont(PDType1Font.HELVETICA); 
    cell.setFontSize(11); 

} 
table.draw(); 

私は解決策またはPDF内のテーブルをレンダリングする別の方法を探しています。

+0

ちょうど読んでから、これは箱の側で何らかの調査が必要なバグです。まず、ページに収まる行の表セルを最大限に確保してください。 1つの行の「キャリーオーバー」セルを導入することによって達成される。行にセルの繰り越しがある場合は、新しい行を追加します。 –

+0

@JoopEggenセルの最大行を修正するにはどうすればよいですか?可変ラインを持つ多くのセルが存在する可能性があります。その場合、最大ラインも変化します – HBK

+0

以下にいくつかのパッチコードを追加しました。 –

答えて

0

ライブラリではページ区切りがうまく処理できないようです。 商業馬itextは、この場合に言及する価値があります。

実用的な解決策になるかもしれないいくつかの行の行の先制分割を行って、改ページのためにテーブルを自分で準備します。

行以下

は、改ページが正しく動作することに頼って、ページあたり最大行に制限されます。複数行で

public int lineno; 
public int linesPerPage = 50; // Not counting header lines. 

public void splitRow(List<String> multilineRow) { 

スプリット単一の行のセル値(ワードラップここでは無視):

List<List<String>> sublines = new ArrayList<>(multilineRow.size()); 
    int sublineCount = 0; 
    for (String cellValue : multilineRow) { 
     List<String> column = Arrays.asList(cellValue.split("\r?\n")); 
     sublines.add(column); 
     sublineCount = Math.max(sublineCount, column.size()); 
    } 

はその後、我々は、列ごとにサブラインを持って、1行に複数のサブラインをバンドル:

for (int sublineI = 0; sublineI < sublineCount;) { 
     int linesPerRow = Math.min(sublineCount, linesPerPage - lineno); 
     if (linesPerRow <= 0) { 
      break; 
     } 
     int sublineI2 = sublineI + linesPerRow; 

     List<String> cellValues = new ArrayList<>(multilineRow.size()); 
     for (int j = 0; j < multilineRow.size(); ++j) { 
      List<String> column = sublines.get(j); 
      String value = ""; 
      if (sublineI < column.size()) { 
       List<String> vs = column.subList(sublineI, 
             Math.min(sublineI2, column.size())); 
       value = vs.stream().collect(Collectors.joining("\n")); 
      } 
      cellValues.add(value); 
     } 
     createRow(); 
     ++lineno; 
     .... fill with cellValues.get(0) and get(1) 
     sublineI = sublineI2; 
     if (lineno >= linesPerPage) { 
      lineno = 0 
     } 
     //if (sublineI < sublineCount) { 
     // Page break/createHeader; 
     //} 
    } 
} 

これは非常に固い解決策ではありません。しかし、ライブラリのバグが取り除かれるまでパッチを提供するかもしれません。

関連する問題