Java 使用iText7将多个表打印到pdf上
我正试图把几张桌子放在一页上。我已经实现了一个潜在的解决方案,我的问题是如何在我想要的时候转到下一个打印区域,而不是当当前打印区域被填充时。 这就是它现在输出的样子。我增加了字体大小,这样第二个区域就会自动部分填充。我有没有办法告诉它在我想使用下一个区域时,而不是在iText7想使用时使用下一个区域 我的代码是:Java 使用iText7将多个表打印到pdf上,java,itext7,Java,Itext7,我正试图把几张桌子放在一页上。我已经实现了一个潜在的解决方案,我的问题是如何在我想要的时候转到下一个打印区域,而不是当当前打印区域被填充时。 这就是它现在输出的样子。我增加了字体大小,这样第二个区域就会自动部分填充。我有没有办法告诉它在我想使用下一个区域时,而不是在iText7想使用时使用下一个区域 我的代码是: import java.io.File; import java.io.FileNotFoundException; import com.itextpdf.io.IOEx
import java.io.File;
import java.io.FileNotFoundException;
import com.itextpdf.io.IOException;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.layout.LayoutArea;
import com.itextpdf.layout.layout.LayoutResult;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.renderer.DocumentRenderer;
public class ColumnDocumentRendererTest {
static PdfDocument pdfDoc;
static Document document;
Table tble;
protected int nextAreaNumber = 0;
public static final String DEST = "./target/test/resources/sandbox/tables/horizontzl_alignment.pdf";
public ColumnDocumentRendererTest(Document document2) {
// TODO Auto-generated constructor stub
}
public static void main(String[] args)
throws IOException, FileNotFoundException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new ColumnDocumentRendererTest(document).createPdf(DEST);
}
public void createPdf(String dest)
throws IOException, FileNotFoundException {
pdfDoc = new PdfDocument(new PdfWriter(DEST));
document = new Document(pdfDoc);
ColumnDocumentRenderer renderer = new ColumnDocumentRenderer(document);
document.setRenderer(renderer);
//Add paragraph to the document
tble = new Table(new float[] { 3f, 3f, 3f, 3f, 3f, 3f, 3f });
/*tble.addCell(new Cell()
.add(new Paragraph(tokenizer.nextToken()).setFont(font)));*/
for (int i = 1; i <= 21; i++) {
tble.addCell(new Cell().add(new Paragraph(Integer.toString(i))
.setTextAlignment(TextAlignment.RIGHT)
.setFontSize((float) 20.5)));
}
document.add(tble);
document.close();
}
}
导入java.io.File;
导入java.io.FileNotFoundException;
导入com.itextpdf.io.IOException;
导入com.itextpdf.kernel.geom.Rectangle;
导入com.itextpdf.kernel.pdf.PdfDocument;
导入com.itextpdf.kernel.pdf.PdfWriter;
导入com.itextpdf.layout.Document;
导入com.itextpdf.layout.element.Cell;
导入com.itextpdf.layout.element.paragration;
导入com.itextpdf.layout.element.Table;
导入com.itextpdf.layout.layout.layoutrea;
导入com.itextpdf.layout.layout.LayoutResult;
导入com.itextpdf.layout.property.TextAlignment;
导入com.itextpdf.layout.renderer.DocumentRenderer;
公共类ColumnDocumentRenderTest{
静态pdfdocumentpdfdoc;
静态文档;
表tble;
受保护的整数nextAreaNumber=0;
公共静态最终字符串DEST=“./target/test/resources/sandbox/tables/horizontzl_alignment.pdf”;
公共列DocumentRenderTest(文档文档2){
//TODO自动生成的构造函数存根
}
公共静态void main(字符串[]args)
抛出IOException、FileNotFoundException{
文件文件=新文件(DEST);
文件.getParentFile().mkdirs();
新建ColumnDocumentRenderTest(document).createPdf(DEST);
}
公共void createPdf(字符串dest)
抛出IOException、FileNotFoundException{
pdfDoc=新PdfDocument(新PdfWriter(DEST));
文件=新文件(pdfDoc);
ColumnDocumentRenderer=新的ColumnDocumentRenderer(文档);
文档。设置渲染器(渲染器);
//在文件中添加段落
tble=新表(新浮点[]{3f,3f,3f,3f,3f,3f});
/*tble.addCell(新单元格()
.add(新段落(tokenizer.nextToken()).setFont(font))*/
对于(inti=1;i我没有阅读iText7的文档,该文档为这个问题提供了一个很好的解释
答案证明是使用“画布”而不是“文档”。
以下代码解决了该用例:
public class TablePrinter {
static PdfDocument pdfDoc;
Table tble;
protected int nextAreaNumber = 0;
public TablePrinter() {
}
public static final String DEST = "./target/test/resources/sandbox/tables/tables_printed.pdf";
public void createPdf(String dest) throws IOException, java.io.IOException {
//
PdfFont font = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN);
PdfFont bold = PdfFontFactory.createFont(FontConstants.TIMES_BOLD);
pdfDoc = new PdfDocument(new PdfWriter(dest));
PdfPage page = pdfDoc.addNewPage();
PdfCanvas pdfCanvas = new PdfCanvas(page);
Rectangle rectangle = new Rectangle(70, 722, 200, 100);
pdfCanvas.rectangle(rectangle);
pdfCanvas.stroke();
Canvas canvas = new Canvas(pdfCanvas, pdfDoc, rectangle);
Text title = new Text("The Strange Case of Dr. Jekyll and Mr. Hyde")
.setFont(bold);
Text author = new Text("Robert Louis Stevenson").setFont(font);
Paragraph p = new Paragraph().add(title).add(" by ").add(author);
canvas.add(p);
rectangle = new Rectangle(310, 722, 200, 100);
pdfCanvas.rectangle(rectangle);
pdfCanvas.stroke();
canvas.close();
canvas = new Canvas(pdfCanvas, pdfDoc, rectangle);
tble = new Table(new float[] { 3f, 3f, 3f, 3f, 3f, 3f, 3f });
/*tble.addCell(new Cell()
.add(new Paragraph(tokenizer.nextToken()).setFont(font)));*/
int DaysInMonth = 31;
for (int i = 1; i <= 35; i++) {
if (i <= DaysInMonth) {
tble.addCell(new Cell().add(new Paragraph(Integer.toString(i))
.setTextAlignment(TextAlignment.RIGHT)
.setFontSize((float) 8.0)));
if ((i >= DaysInMonth) && (i % 7 == 0))
break;
} else {
tble.addCell(new Cell());
if (i % 7 == 0)
break;
}
}
p = new Paragraph().add(tble);
canvas.add(p);
canvas.close();
pdfDoc.close();
//
}
public void addParagraph(Document document, int count) {
Paragraph p;
TextAlignment alignment;
for (int i = 1; i < count + 1; i++) {
p = new Paragraph("entry" + String.valueOf(i));
alignment = (i % 2 != 0) ? TextAlignment.LEFT : TextAlignment.RIGHT;
p.setTextAlignment(alignment);
document.add(p);
}
}
public static void main(String[] args)
throws IOException, java.io.IOException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new TablePrinter().createPdf(DEST);
}
}
公共类表格打印机{
静态pdfdocumentpdfdoc;
表tble;
受保护的整数nextAreaNumber=0;
公共桌面打印机(){
}
公共静态最终字符串DEST=“./target/test/resources/sandbox/tables/tables\u printed.pdf”;
public void createPdf(String dest)抛出IOException,java.io.IOException{
//
PdfFont font=PdfFontFactory.createFont(FontConstants.TIMES_ROMAN);
PdfFont bold=PdfFontFactory.createFont(fontcants.TIMES_bold);
pdfDoc=新PdfDocument(新PdfWriter(dest));
PdfPage page=pdfDoc.addNewPage();
PdfCanvas PdfCanvas=新PdfCanvas(第页);
矩形=新矩形(70722200100);
pdfCanvas.矩形(矩形);
pdfCanvas.stroke();
画布画布=新画布(pdfCanvas、pdfDoc、矩形);
文本标题=新文本(“杰基尔博士和海德先生的奇怪案例”)
.setFont(粗体);
文本作者=新文本(“罗伯特·路易斯·史蒂文森”)。设置字体(字体);
段落p=新段落()。添加(标题)。添加(“作者”)。添加(作者);
canvas.add(p);
矩形=新矩形(310722200100);
pdfCanvas.矩形(矩形);
pdfCanvas.stroke();
canvas.close();
画布=新画布(pdfCanvas、pdfDoc、矩形);
tble=新表(新浮点[]{3f,3f,3f,3f,3f,3f});
/*tble.addCell(新单元格()
.add(新段落(tokenizer.nextToken()).setFont(font))*/
int DaysInMonth=31;
对于(int i=1;i您可以添加区域分隔符,但不能在单个表中添加。假设单个表将连续呈现,每个区域包含尽可能多的行。添加AreaBreak
也可能有效,正如@mkl在其注释中指出的那样。这可能是最简单的解决方案。另一个解决方案可能是使用ext结束DocumentRenderer
,就像本教程中的MyColumnRenderer
课程一样。然而,这比你在答案中所做的要复杂得多,所以答案是+1(在我做的时候,我也给了你+1)。@BrunoLowagie:非常感谢你的支持和善意的评论。