合并两个pdf

时间:2018-01-24 12:56:35

标签: itext7

我们使用iText 7.1.0和html2pdf 2.0.0创建了一个应用程序来构建我们的pdf。 在我们的第一次迭代中,我们向它发送一个数据对象,其中包括用于标题,正文和页脚的html,此外还包括标题等元数据。

html-body包括2部分:details-part和table-part。

到目前为止,一切工作正常,链接和锚点的样式和可点击性,元数据设置正确(除此之外:我们的标题html中仍然存在问题,有一个徽标,但我们无法构建这个链接)。

我们更改了应用程序的行为:现在我们将一组数据对象放到应用程序中(细节部分和表格部分分开;两个数据对象中的每一个都包含用于标题,正文和页脚的html,还有元数据-数据)。我们遍历集合,使用之前工作正常的相同方法并将这两个部分合并在一起。

现在链接和锚点已设置样式但不再可点击。我们也看不到元数据。在构建合并时我们有什么问题吗?

控制器:

public byte[] index(@RequestBody PDFDataModelCollection elements, Model model) throws IOException {

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    PdfWriter writer = new PdfWriter(byteArrayOutputStream);
    try (PdfDocument resultDoc = new PdfDocument(writer)) {
        for (PDFDataModel pdfDataModel : elements.getElements()) {
            PdfReader reader = new PdfReader(new ByteArrayInputStream(creationService.createDatasheet(pdfDataModel)));
            try (PdfDocument sourceDoc = new PdfDocument(reader)) {
                int n = sourceDoc.getNumberOfPages();
                for (int i = 1; i <= n; i++) {
                    PdfPage page = sourceDoc.getPage(i).copyTo(resultDoc);
                    resultDoc.addPage(page);
                }
            }
        }
    }

    return byteArrayOutputStream.toByteArray();
}

方法createDatasheet():

public byte[] createDatasheet(PDFDataModel pdfDataModel) throws IOException {

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

    PdfWriter writer = new PdfWriter(byteArrayOutputStream);

    //Initialize PDF document
    PdfDocument pdfDoc = new PdfDocument(writer);

    try (
        Document document = new Document(pdfDoc)
    ) {
        document.setMargins(0, 0, 0, 0);

        //meta tags
        PDFMetaService.addPdfMetaTags(pdfDoc, pdfDataModel.getMetaModel());

        Header header = new Header(document, this.fontProvider, pdfDataModel.getHeader());

        pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, header);
        pdfDoc.addEventHandler(PdfDocumentEvent.INSERT_PAGE, header);

        Footer footer = new Footer(document, this.fontProvider, pdfDataModel.getFooter());
        pdfDoc.addEventHandler(PdfDocumentEvent.INSERT_PAGE, footer);

        //watermark
        PDFImageModel pdfImageModel = pdfDataModel.getImageModel();
        if (pdfImageModel != null) {
            Watermark watermark = new Watermark(document, pdfImageModel);
            pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, watermark);
        }

        //body
        for (IElement element : HtmlConverter.convertToElements(pdfDataModel.getBody(), this.props)) {
            document.add((IBlockElement) element);
        }

        footer.writeTotalNumberOnPages(pdfDoc);
    }

    return byteArrayOutputStream.toByteArray();
}

pdfDataModel.getMetaModel(),pdfDataModel.getHeader(),pdfDataModel.getBody()等返回setter / getter类;那里存有html。

任何建议都会有所帮助......

1 个答案:

答案 0 :(得分:0)

我们已将控制器更改为此,现在可以正常运行:

@RequestMapping(value = "/pdf", method = RequestMethod.POST, produces = MediaType.APPLICATION_PDF_VALUE)
public byte[] index(@RequestBody PDFDataModelCollection pdfDataCollection, Model model) throws IOException {

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    PdfWriter writer = new PdfWriter(byteArrayOutputStream);

    try (PdfDocument resultDoc = new PdfDocument(writer)) {
        LOGGER.debug("Parsing {} element(s) from PDFDataModelCollection.", pdfDataCollection.getElements().size());
        for (PDFDataModel pdfDataModel : pdfDataCollection.getElements()) {
            PdfReader reader = new PdfReader(new ByteArrayInputStream(creationService.createDatasheet(pdfDataModel)));
            PdfDocument sourceDoc = new PdfDocument(reader);
            sourceDoc.copyPagesTo(1, sourceDoc.getNumberOfPages(), resultDoc, resultDoc.getNumberOfPages()+1);
        }

        PDFMetaService.addPdfMetaTags(resultDoc, pdfDataCollection.getElements().get(1).getMetaModel());
    }

    return byteArrayOutputStream.toByteArray();
}