我们使用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。
任何建议都会有所帮助......
答案 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();
}