Warm tip: This article is reproduced from serverfault.com, please click

itext-iText7:com.itextpdf.kernel.PdfException:词典不支持字体数据

(itext - iText7: com.itextpdf.kernel.PdfException: Dictionary doesn't have supported font data)

发布于 2020-12-03 08:14:52

我尝试为我的pdf生成一个toc(目录),并且我想使用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)
Questioner
Bottle
Viewed
0
mkl 2020-12-03 17:44:58

每当你将内容添加到PdfDocument喜欢的地方时,你都可以在这里进行操作

Document document = new Document(pdfDoc);

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

你必须知道此内容尚未以其最终形式存储;例如,所使用的字体尚未正确子集化。当你关闭文档时,将生成最终表单。

另一方面,文本提取要求提取的内容采用最终形式。

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

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