PdfBox - 更改 pdf 文件中的字体或字体名称?

PdfBox - change font or fontName in pdf file?

请告诉我。

我有一个字体为 HPDFAA+Arial-BoldMTBold 的 pdf 文件。这个字体名称不正确,它是一个子集...... 我使用库 Asponse.pdf.dll、https://docs.aspose.com/pdf/net/replace-text-in-pdf/、段落更改字体 - 替换现有 PDF 文件中的字体,但此库跟踪版本。

我如何使用 PDFBox 执行此操作?我想在 Arial-BoldMT 上替换此字体或重命名字体名称。

UPD:我的尝试无济于事...在 PDFontDescriptor 中我可以重命名字体,但我如何申请 PDFont?还是我走错路了?

        PDDocument pdfDocument = PDDocument.load(new File("Sample.pdf"));

        PDPageTree pages = pdfDocument.getDocumentCatalog().getPages();
        for (PDPage page : pages) {
            PDResources res = page.getResources();

            for (COSName fontName : res.getFontNames()) {
                PDFont font = res.getFont(fontName);
                PDFontDescriptor fontDescriptor = font.getFontDescriptor();
                System.out.println("fontDes: " + fontDescriptor.getFontName());
                String oldFontName = fontDescriptor.getFontName();
                String newFontName = oldFontName.replace("Arial-BoldMTBold", "Arial-BoldMT");
                fontDescriptor.setFontName(newFontName);

                System.out.println("font: " + font.getName());
            }

这是为您的文件量身定制的代码。只有当这是关于许多相似的文件时,它才会对您有所帮助。

try (PDDocument doc = PDDocument.load(new File(XXX,"outerBox.pdf")))
{
    PDPage page = doc.getPage(0);
    for (COSName name : page.getResources().getFontNames())
    {
        PDFont font = page.getResources().getFont(name);
        String fontName = font.getName();
        if (font instanceof PDType0Font && fontName.endsWith("BoldMTBold"))
        {
            PDType0Font type0font = (PDType0Font) font;
            String newFontName = fontName.substring(0, fontName.length() - 4);
            type0font.getCOSObject().setString(COSName.BASE_FONT, newFontName);
            PDCIDFont descendantFont = type0font.getDescendantFont();
            descendantFont.getCOSObject().setString(COSName.BASE_FONT, newFontName);
            PDFontDescriptor fontDescriptor = descendantFont.getFontDescriptor();
            fontDescriptor.setFontName(newFontName);
        }
    }
    doc.save(new File(XXX,"outerBox-saved.pdf"));
}

PDF 结构,使用 PDFDebugger 查看: