iText html2pdf从HTML转换后可视化PDF格式的标签问题

Mat*_* G. 3 html css java pdf-generation itext

我用:

  • html2pdf v2.0.1
  • iText 7.1.1

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

<label class="test">Patient</label>
Run Code Online (Sandbox Code Playgroud)

这是我的css:

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

HTML中的标签可视化

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

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;
}
Run Code Online (Sandbox Code Playgroud)

Yul*_*nko 5

实际上,这是iText当前版本中的问题,你的假设是正确的.

有两个不同的问题,第一个是在pdfHTML display:blockfor labelelement中不支持,而是默认为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以将它们设置为ConverterProperties:

props.setTagWorkerFactory(new LabelBlockTagWorkerFactory());
props.setCssApplierFactory(new LabelBlockCssApplierFactory());
Run Code Online (Sandbox Code Playgroud)

第二个问题是border-radius内联元素背景的属性支持.它实际上是目前iText中的一个错误,修复并不是一件容易的事,但是对于块元素它可以正常工作,因此在解决display:block问题之后,它现在不应该是你的问题.