pdf字体嵌入不起作用

hc8w905p  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(288)

我正在努力嵌入那些没有嵌入到pdf的字体。为此,我使用pdfbox库来识别丢失的字体 PDFont 班级。使用这个我可以确定丢失的字体列表。但是当我试图用我的本地机器字体(从我的本地机器字体文件夹抓取的ttf文件)嵌入它们时,我无法做到这一点,得到以下结果。

我使用下面的代码来获取字体列表(不是嵌入的),

private static List<FontsDetails> checkAllFontsEmbeddedOrNot(PDDocument pdDocument) throws Exception {
    List<FontsDetails> notEmbFonts = null;
    try {
        if(null != pdDocument){
            PDPageTree pageTree = pdDocument.getDocumentCatalog().getPages();
            notEmbFonts = new ArrayList<>();
            for (PDPage pdPage : pageTree) {
                PDResources resources = pdPage.getResources();
                Iterable<COSName> cosNameIte = resources.getFontNames();
                Iterator<COSName> names = cosNameIte.iterator();
                while (names.hasNext()) {
                    COSName name = names.next();
                    PDFont font = resources.getFont(name);
                    boolean isEmbedded = font.isEmbedded();
                    if(!isEmbedded){
                        FontsDetails fontsDetails = new FontsDetails();
                        fontsDetails.setFontName(font.getName().toString());
                        fontsDetails.setFontSubType(font.getSubType());
                        notEmbFonts.add(fontsDetails);
                    }
                }
            }
        }
    } catch (Exception exception) {
        logger.error("Exception occurred while validating fonts : ", exception);
        throw new PDFUtilsException("Exception occurred while validating fonts : ",exception);
    }
    return notEmbFonts;
}

下面是我用来嵌入字体的代码,我从上面的列表中得到,

public List<FontsDetails> embedFontToPdf(File pdf, FontsDetails fontToEmbed) {
    ArrayList<FontsDetails> notSupportedFonts = new ArrayList<>();
    try (PDDocument pdDocument = PDDocument.load(pdf)) {
        LOGGER.info("Embedding font : " + fontToEmbed.getFontName());
        InputStream ttfFileStream =  PDFBoxOperationsUtility.class.getClassLoader()
                .getResourceAsStream(fontToEmbed.getFontName() + ".ttf");//loading ttf file
        if (null != ttfFileStream) {
            PDFont font = PDType0Font.load(pdDocument, ttfFileStream);
            PDPage pdfPage = new PDPage();
            PDResources pdfResources = new PDResources();
            pdfPage.setResources(pdfResources);

            PDPageContentStream contentStream = new PDPageContentStream(pdDocument, pdfPage);
            if (fontToEmbed.getFontSize() == 0) {
                fontToEmbed.setFontSize(DEFAULT_FONT_SIZE);
            }
            font.encode("ANSI");
            contentStream.setFont(font, fontToEmbed.getFontSize());
            contentStream.close();

            pdDocument.addPage(pdfPage);
            pdDocument.save(pdf);
        } else {
            LOGGER.info("Font : " + fontToEmbed.getFontName() + " not supported");
            notSupportedFonts.add(fontToEmbed);
        }
    } catch (Exception exception) {
        notSupportedFonts.add(fontToEmbed);
        LOGGER.error("Error ocurred while embedding font to pdf : " + pdf.getName(), exception);
    }
    return notSupportedFonts;
}

有没有人能帮我确定一下我犯了什么错误,或者我需要采取什么其他的方法。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题