gpt4 book ai didi

java - iText html2pdf 从 HTML 转换后 PDF 中标签可视化的问题

转载 作者:搜寻专家 更新时间:2023-10-31 22:54:00 24 4
gpt4 key购买 nike

我使用:

  • html2pdf v2.0.1
  • iText 7.1.1

在我的 HTML 中,我有以下标签占据了页面的整个宽度:

<label class="test">Patient</label>

这是我的CSS:

.test {
display: block;
font-weight: bold;
color: #009fd1;
font-size: .6em;
text-align: left;
padding: 0.5rem;
background: #085a9f;
border-radius: 3px;
}

Label visualisation in HTML

当我使用 iText 将 HTML 转换为 PDF 时,我的标签显示如下:

Label visualisation in HTML

在我看来,除了 display: blockborder-radius: 3px

之外,他似乎一切都正确了

这是 iText 中的问题吗?

为了完整起见,这是我的转换代码:

    public ByteArrayOutputStream createPdf(String html) throws IOException {
ByteArrayOutputStream baos = null;
html = replaceStylesheet(html);
try {
baos = new ByteArrayOutputStream();
WriterProperties writerProperties = new WriterProperties();
//Add metadata
writerProperties.addXmpMetadata();
PdfWriter pdfWriter = new PdfWriter(baos, writerProperties);

PdfDocument pdfDoc = new PdfDocument(pdfWriter);
PageSize pageSize = PageSize.A4;
pdfDoc.setDefaultPageSize(pageSize);
pdfDoc.getCatalog().setLang(new PdfString("en-US"));
//Set the document to be tagged
pdfDoc.setTagged();
PdfViewerPreferences pdfViewerPreferences = new PdfViewerPreferences();
pdfViewerPreferences.setDisplayDocTitle(true);
pdfDoc.getCatalog().setViewerPreferences(pdfViewerPreferences);

//Create event-handlers
String header = "© 2018 Generated by OpenNCP Portal";
Header headerHandler = new Header(header);
PageXofY footerHandler = new PageXofY(pdfDoc);

//Assign event-handlers
pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE,headerHandler);
pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE,footerHandler);

// pdf conversion
ConverterProperties props = new ConverterProperties();
FontProvider dfp = new DefaultFontProvider(true, false, false);

props.setFontProvider(dfp);

HtmlConverter.convertToDocument(html, pdfDoc, props);
footerHandler.writeTotal(pdfDoc);
pdfDoc.close();
} catch (Exception e) {
LOGGER.error("Error occurred when converting HTML to PDF", e);
}
return baos;
}

最佳答案

确实,这是 iText 当前版本的问题,您的假设是正确的。

有两个明显的问题,第一个是在 pdfHTML 中 display:block 不支持 label 元素,而是默认为 inline。然而,对于 label 来说,支持 display:block 似乎相当容易,你只需要扩展 DefaultTagWorkerFactoryDefaultCssApplierFactory像这样:

private static class LabelBlockTagWorkerFactory extends DefaultTagWorkerFactory {
@Override
public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
if (!TagConstants.LABEL.equals(tag.name())) {
return null;
}
String display;
if (tag.getStyles() == null || (display = tag.getStyles().get(CssConstants.DISPLAY)) == null) {
return null;
}
if (CssConstants.BLOCK.equals(display)) {
return new DivTagWorker(tag, context);
}
return null;
}

}

private static class LabelBlockCssApplierFactory extends DefaultCssApplierFactory {
@Override
public ICssApplier getCustomCssApplier(IElementNode tag) {
if (!TagConstants.LABEL.equals(tag.name())) {
return null;
}
String display;
if (tag.getStyles() == null || (display = tag.getStyles().get(CssConstants.DISPLAY)) == null) {
return null;
}
if (CssConstants.BLOCK.equals(display)) {
return new BlockCssApplier();
}
return null;
}
}

然后你可以在ConverterProperties中设置它们:

props.setTagWorkerFactory(new LabelBlockTagWorkerFactory());
props.setCssApplierFactory(new LabelBlockCssApplierFactory());

第二个问题是 border-radius 属性支持内联元素的背景。它实际上目前是 iText 中的一个错误,修复起来并非完全微不足道,但它适用于 block 元素,所以在你解决 display:block 问题后,它现在不应该成为你的问题.

关于java - iText html2pdf 从 HTML 转换后 PDF 中标签可视化的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49944628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com