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 查看:
请告诉我。
我有一个字体为 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 查看: