Как установить новый другой шрифт при конвертации HTML в PDF с помощью ITEXTRenderer

Я пытаюсь преобразовать HTML в PDF. В HTML у меня есть некоторые символы, которые не отображаются в документе PDF. Во время отладки я обнаружил, что & # 8209 или & # x2011 символ недоступен ни в одном из шрифтов по умолчанию, доступных в библиотеке IText. Мой HTML не имеет Arial Unicode MS в своем семействе шрифтов, и из-за этого, даже если я добавлю этот шрифт в свой редактор Itext, он не будет работать. Так что я пытаюсь выяснить во время создания PDF, можем ли мы сделать это с помощью шрифта, который не упоминается в HTML? Образец HTML:

<html lang="en">
    <title>Sample HTML</title>
    <body>
        <div style="font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:23px; color:#3F3F3F; font-weight:normal; ">Please call this 
            number in case of emergency,  123&#x2011;456&#x2011;7890.
        </div>
    </body>
</html>

Java-код:

@Component
public class PDFConverter {

@Autowired
private Tidy tidy;

@Autowired
private ITextRenderer renderer;

@Autowired
private Gson gson;

public String pdfBox(byte[] bytes) {
    byte[] outDoc = null;
    String pdf = null;
    try {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        String html = new String(bytes);
        String xhtml = toXHTML(html);
        InputStream is = new ByteArrayInputStream(xhtml.getBytes("UTF-8"));
        ITextFontResolver  resolver = renderer.getFontResolver();
        Document doc = tidy.parseDOM(is, null);
        renderer.setDocument(doc, null);
        resolver.addFont("*filepath*/ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 
        renderer.layout();
        renderer.createPDF(outputStream);
        outDoc = outputStream.toByteArray();
        pdf = Base64.getEncoder().encodeToString(outDoc);
        renderer.finishPDF();
        outputStream.flush();
        outputStream.close();
    } catch (DocumentException | IOException e) {
        e.printStackTrace();
    }

    return pdf;
}

private String toXHTML(String html) {
    final org.jsoup.nodes.Document document = org.jsoup.Jsoup.parse(html, "UTF-8");
    document.outputSettings().syntax(org.jsoup.nodes.Document.OutputSettings.Syntax.xml);
    document.outputSettings().prettyPrint(false);
    document.outputSettings().charset("ASCII");
    document.outputSettings().escapeMode(EscapeMode.xhtml);
    return document.html();
}

}

0 ответов

Другие вопросы по тегам