c# - 如何使用 itext7 .NET 将 pdf 文件拆分为列
问题描述
我需要将 gridview 导出到 pdf 文件中,但由于有数百行,我必须尽可能地利用空间。为此,我需要将页面拆分为列,如下所示
| Header |
| A | B | C || A | B | C || A | B | C |
| A | B | C || A | B | C || A | B | C |
| A | B | C || A | B | C || A | B | C |
| A | B | C || A | B | C || A | B | C |
| A | B | C || A | B | C || A | B | C |
| A | B | C || A | B | C || A | B | C |
| A | B | C || A | B | C || A | B | C |
解决方案
尽管您要求 C# 解决方案,但我会为您提供 Java 解决方案。由于 API 相同,因此将代码移植到 C# 应该没有问题。
你实际上问了两个问题:
1)如何在iText7中启用n列布局(在你的情况下n等于三)?2) 如何为文档的每一页添加页眉?
让我们按数字工作。
1)ColumnDocumentRenderer
对此负责。您应该只传递列要占用的区域,iText 将自行执行其他任何操作:
Document document = new Document(pdfDocument, PageSize.A4.rotate());
Rectangle[] columns = {new Rectangle(36, 36, 250, 423),
new Rectangle(36 + 250 + 10, 36, 250, 423),
new Rectangle(36 + 250 + 250 + 20, 36, 250, 423)};
document.setRenderer(new ColumnDocumentRenderer(document, columns));
2) IEventHandler
s 对此负责。Ypou 应该只实现您的标头并在某些事件上处理它(例如, on PdfDocumentEvent.START_PAGE
):
public class TableHeaderEventHandler implements IEventHandler {
@Override
public void handleEvent(Event event) {
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
Canvas canvas = new Canvas(docEvent.getPage(), new Rectangle(36, 36 + 423, 780, 100));
canvas.add(new Paragraph("Header").setTextAlignment(TextAlignment.CENTER));
}
}
TableHeaderEventHandler handler = new TableHeaderEventHandler();
pdfDocument.addEventHandler(PdfDocumentEvent.START_PAGE, handler);
整个例子:
@Test
public void threeColumnTableTest() throws IOException {
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(destinationFolder + "threeColumnTable.pdf"));
Document document = new Document(pdfDocument, PageSize.A4.rotate());
Rectangle[] columns = {new Rectangle(36, 36, 250, 423),
new Rectangle(36 + 250 + 10, 36, 250, 423),
new Rectangle(36 + 250 + 250 + 20, 36, 250, 423)};
document.setRenderer(new ColumnDocumentRenderer(document, columns));
TableHeaderEventHandler handler = new TableHeaderEventHandler();
pdfDocument.addEventHandler(PdfDocumentEvent.START_PAGE, handler);
Table table = new Table(3);
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 3; j++) {
table.addCell("row " + i + "column " + j);
}
}
document.add(table);
document.close();
}
public class TableHeaderEventHandler implements IEventHandler {
@Override
public void handleEvent(Event event) {
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
Canvas canvas = new Canvas(docEvent.getPage(), new Rectangle(36, 36 + 423, 780, 100));
canvas.add(new Paragraph("Header").setTextAlignment(TextAlignment.CENTER));
}
}
推荐阅读
- java - 如何从集合中的excel数据中找到一些字符串元素?.contains 方法在我的情况下不起作用
- javascript - 如何使用不同的表 id 显示两个 html 表?
- python - PyInstaller Orange3 __main__ Python 脚本调用不同文件夹中的脚本不起作用
- java - 保存后休眠插入
- javascript - 页面显示纯 html 文本而不是呈现 html 表
- java - Java对工厂方法的DAO定义
- dask - 在所有 dask.distributed worker / scheduler 中维护一个 git 存储库
- python - Flake8 E901 print() 语句的意外行为
- visual-studio - 共享项目选项完全从 Visual Studio 2019 中的 Xamarin.Forms 项目菜单中消失了吗?
- apache-flink - 闪现uid。我们真的需要它吗?它不使用一个默认的吗?