iText7: com.itextpdf.kernel.PdfException: 词典没有支持的字体数据

iText7: com.itextpdf.kernel.PdfException: Dictionary doesn't have supported font data

我尝试为我的 pdf 生成目录(table 内容),我想使用 ITextExtractionStrategy 获取一些看起来像 xxx.pdf 中的章节标题的字符串。但是我在 运行 考试的时候得到了 com.itextpdf.kernel.PdfException。

这是我的代码:

    @org.junit.Test
    public void test() throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfDocument pdfDoc = new PdfDocument(new PdfReader("src/test/resources/template/xxx.pdf"),
                new PdfWriter(baos));

        pdfDoc.addNewPage(1);
        Document document = new Document(pdfDoc);

        // when add this code, throw com.itextpdf.kernel.PdfException: Dictionary doesn't have supported font data.
        Paragraph title =  new Paragraph(new Text("index"))
                .setTextAlignment(TextAlignment.CENTER);
        document.add(title);

        SimpleTextExtractionStrategy extractionStrategy = new SimpleTextExtractionStrategy();
        for (int i = 1; i < pdfDoc.getNumberOfPages(); i++) {
            PdfPage page = pdfDoc.getPage(i);
            PdfCanvasProcessor parser = new PdfCanvasProcessor(extractionStrategy);
            parser.processPageContent(page);
        }
        ...

        document.close();
        pdfDoc.close();
        new FileOutputStream("./yyy.pdf").write(baos.toByteArray());
    }

这是输出:

com.itextpdf.kernel.PdfException: Dictionary doesn't have supported font data.

    at com.itextpdf.kernel.font.PdfFontFactory.createFont(PdfFontFactory.java:123)
    at com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor.getFont(PdfCanvasProcessor.java:490)
    at com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor$SetTextFontOperator.invoke(PdfCanvasProcessor.java:811)
    at com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor.invokeOperator(PdfCanvasProcessor.java:454)
    at com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor.processContent(PdfCanvasProcessor.java:282)
    at com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor.processPageContent(PdfCanvasProcessor.java:303)
    at com.example.pdf.util.Test.test(Test.java:138)

每当您像此处那样向 PdfDocument 添加内容时

Document document = new Document(pdfDoc);

Paragraph title = new Paragraph(new Text("index"))
    .setTextAlignment(TextAlignment.CENTER);
document.add(title);

您必须知道此内容尚未以其最终形式存储;例如,使用的字体还没有被正确地子集化。关闭文档时会生成最终表单。

另一方面,文本提取需要要提取的内容是其最终形式。

因此,您不应将文本提取应用于您正在处理的文档。特别是,不要将文本提取应用于您已更改内容的页面。

如果您需要从自己创建的文档中提取文本,请先关闭文档,从输出中打开一个新文档,然后从该新文档中提取文本。