私はiText 5.5.9を使用しています。私はColumnText
の中に示すPdfPTable
を持っています。 ColumnText
には、小さな列と大きな列があります。iTextテーブル内のColumnTextはキーではありません
テーブルが小さい列に対して大きすぎる場合は、2番目の大きな列に移動する必要があります。これどうやってするの?
table.setKeepTogether(true)
を使ってみましたが、うまくいきません。 私はこのページ(http://itext.2136553.n4.nabble.com/PdfPTable-KeepTogether-and-ColumnText-td2141501.html)から、テーブルを2番目のテーブルにラップして、tableWrapper.setSplitRows(false)
を使用することを提案しました。しかし、もし私がそれをすれば、私はもうテーブルを見ることはありません。私は私ではなく、問題そのものについてよりも、ソリューションについて求めていることを今実現:
public class PdfTest {
private static String filename = "C:/Users/Development/Documents/pdf_test.pdf";
public static void main(String[] args) {
try {
new PdfTest();
File f = new File(filename);
Desktop.getDesktop().open(f);
} catch (DocumentException | IOException e) {
e.printStackTrace();
}
}
public PdfTest() throws DocumentException, IOException {
File file = new File(filename);
OutputStream os = new FileOutputStream(file);
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, os);
document.open();
PdfContentByte canvas = writer.getDirectContent();
printPage1(document, canvas);
document.newPage();
printPage2(document, canvas);
document.close();
os.close();
}
private void printPage1(Document document, PdfContentByte canvas) throws DocumentException {
int cols = 3;
int rows = 15;
PdfPTable table = new PdfPTable(cols);
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
table.addCell(new Phrase("Cell " + row + ", " + col));
}
}
Paragraph paragraph = new Paragraph();
paragraph.add(table);
ColumnText columnText = new ColumnText(canvas);
columnText.addElement(new Paragraph("This table should keep together!"));
columnText.addElement(paragraph);
int status = ColumnText.START_COLUMN;
Rectangle docBounds = document.getPageSize();
Rectangle bounds = new Rectangle(docBounds.getLeft(20), docBounds.getTop(20) - 200, docBounds.getRight(20), docBounds.getTop(20));
bounds.setBorder(Rectangle.BOX);
bounds.setBorderColor(BaseColor.BLACK);
bounds.setBorderWidth(1);
bounds.setBackgroundColor(new BaseColor(23, 142, 255, 20));
canvas.rectangle(bounds);
columnText.setSimpleColumn(bounds);
status = columnText.go();
if (ColumnText.hasMoreText(status)) {
bounds = new Rectangle(docBounds.getLeft(20), docBounds.getBottom(20), docBounds.getRight(20), docBounds.getBottom(20) + 600);
bounds.setBorder(Rectangle.BOX);
bounds.setBorderColor(BaseColor.BLACK);
bounds.setBorderWidth(1);
bounds.setBackgroundColor(new BaseColor(255, 142, 23, 20));
canvas.rectangle(bounds);
columnText.setSimpleColumn(bounds);
status = columnText.go();
}
}
private void printPage2(Document document, PdfContentByte canvas) throws DocumentException {
int cols = 3;
int rows = 15;
PdfPTable table = new PdfPTable(cols);
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
table.addCell(new Phrase("Cell " + row + ", " + col));
}
}
PdfPTable tableWrapper = new PdfPTable(1);
tableWrapper.addCell(table);
tableWrapper.setSplitRows(false);
Paragraph paragraph = new Paragraph();
paragraph.add(tableWrapper);
ColumnText columnText = new ColumnText(canvas);
columnText.addElement(new Paragraph("This table should keep together!"));
columnText.addElement(tableWrapper);
int status = ColumnText.START_COLUMN;
Rectangle docBounds = document.getPageSize();
Rectangle bounds = new Rectangle(docBounds.getLeft(20), docBounds.getTop(20) - 200, docBounds.getRight(20), docBounds.getTop(20));
bounds.setBorder(Rectangle.BOX);
bounds.setBorderColor(BaseColor.BLACK);
bounds.setBorderWidth(1);
bounds.setBackgroundColor(new BaseColor(23, 142, 255, 20));
canvas.rectangle(bounds);
columnText.setSimpleColumn(bounds);
status = columnText.go();
if (ColumnText.hasMoreText(status)) {
bounds = new Rectangle(docBounds.getLeft(20), docBounds.getBottom(20), docBounds.getRight(20), docBounds.getBottom(20) + 600);
bounds.setBorder(Rectangle.BOX);
bounds.setBorderColor(BaseColor.BLACK);
bounds.setBorderWidth(1);
bounds.setBackgroundColor(new BaseColor(255, 142, 23, 20));
canvas.rectangle(bounds);
columnText.setSimpleColumn(bounds);
status = columnText.go();
}
}
}
編集:ここでは
は私のコードです。だから私はここに一歩前進している。
PDFには、最初のページにエンベロープウィンドウ用のオプションのスペースがあるという考えがあります。このウィンドウにはアドレスが表示されます。 これは、最初のページの残りの部分をエンベロープウィンドウの上下の2つの領域に分割します。私はColumnText
でそれを解決しようとしました。 タイトルを追加しましたが、これはエンベロープウィンドウの上にきれいに表示されます。次にテーブルを追加しました。この表は、エンベロープ・ウィンドウの上および下に部分的に表示されます。 これらの文字には、テーブルだけでなく複数のテーブルや段落を含むことができます。
あなたはiTextの5の新しいバージョンで問題を再現しようとしたことがありますか?現在のリリースは5.5.9ですが、あなたが直面している問題はその間に修正されている可能性があります。 –
また、すべての5.2.xバージョンに深刻な技術的問題があります。 5.2.0では、バイト位置に対して 'int'から' long'を使用するように変更しましたが、バグのために内部的に 'long'値が' int'に変更され、PDFが破損します。私たちはすべての5.2.xバージョンを撤回し、すべての顧客に警告し、[有料ユーザに通知しました](http://developers.itextpdf.com/content/changelogs/itext-520-521-fruaryruary9-2012-march- 31-2012)。まだそのバージョンを使用するのは無責任です。 –
フィードバックありがとうございます。私はiTextのアップグレードを検討します。 – Dalendrion