首页 > 解决方案 > 如何使用 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#asp.net.netitext

解决方案


尽管您要求 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) IEventHandlers 对此负责。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));
    }
}

结果pdf: 在此处输入图像描述


推荐阅读