PdfBox 将字体嵌入到现有文档中
PdfBox embed fonts into existing document
我有一个 pdf 文件,它在 Okular(或任何 PDF 查看器)中显示字体属性,如下所示:
Name: Helvetica
Type: Type1
File: /usr/share/fonts/truetype/liberation2/LiberationSans-regular.ttf
Embedded: No
我想在 PDFBox 2xx 中嵌入 Helvetica 而不用 修改文件内容(文本)本身,以便它始终可以与文件一起使用。
有可能吗?
我试过类似的东西:
PDDocument document = PDDocument.load(myFile);
InputStream stream = new FileInputStream(new File("/home/user/fonts_temp/Helvetica.ttf"));
PDFont fontToEmbed = PDType0Font.load(document, stream, true);
PDResources resources = document.getPage(pageNumber).getResources();
resources.add(fontToEmbed);
//or use the font from pdfbox:
resources.add(PDType1Font.HELVETICA);
document.save(somewhere);
document.close();
我也试过打电话
COSName fontCosName = resources.add(PDType1Font.HELVETICA);
resources.put(fontCosName, font);
我做错了什么?
编辑:
@TilmanHausherr 谢谢你的线索!但我仍然缺少一些东西。目前我的代码如下:
PDFont helvetica = PDType0Font.load(document, new FileInputStream(new File("/path/Helvetica.ttf")), false);
...
PDResources resources = page.getResources();
for (COSName fontCosName : resources.getFontNames()){
if(resources.getFont(fontCosName).getName().equals("Helvetica")) {
resources.put(fontCosName, helvetica);
}
}
最终结果显示
Helvetica CID TrueType Fully Embedded
但是字体现在根本不显示在 PDF 文件中。我的意思是那些使用字体的地方实际上是空的,空白页......仍然没有东西。
字体本身是从 here
下载的
您需要知道资源中当前使用的名称,因此请使用 resources.getFontNames()
检查这些名称
2。
要替换标准 14 号字体,请使用此字体对象:
PDTrueTypeFont.load(document, file, oldFont.getEncoding() /* or WinAnsiEncoding.INSTANCE which is usually right */ );
这确保使用与标准 14 字体相同的编码。 (Zapf Dingbats 和 Symbol 字体不同)
我有一个 pdf 文件,它在 Okular(或任何 PDF 查看器)中显示字体属性,如下所示:
Name: Helvetica
Type: Type1
File: /usr/share/fonts/truetype/liberation2/LiberationSans-regular.ttf
Embedded: No
我想在 PDFBox 2xx 中嵌入 Helvetica 而不用 修改文件内容(文本)本身,以便它始终可以与文件一起使用。 有可能吗? 我试过类似的东西:
PDDocument document = PDDocument.load(myFile);
InputStream stream = new FileInputStream(new File("/home/user/fonts_temp/Helvetica.ttf"));
PDFont fontToEmbed = PDType0Font.load(document, stream, true);
PDResources resources = document.getPage(pageNumber).getResources();
resources.add(fontToEmbed);
//or use the font from pdfbox:
resources.add(PDType1Font.HELVETICA);
document.save(somewhere);
document.close();
我也试过打电话
COSName fontCosName = resources.add(PDType1Font.HELVETICA);
resources.put(fontCosName, font);
我做错了什么?
编辑:
@TilmanHausherr 谢谢你的线索!但我仍然缺少一些东西。目前我的代码如下:
PDFont helvetica = PDType0Font.load(document, new FileInputStream(new File("/path/Helvetica.ttf")), false);
...
PDResources resources = page.getResources();
for (COSName fontCosName : resources.getFontNames()){
if(resources.getFont(fontCosName).getName().equals("Helvetica")) {
resources.put(fontCosName, helvetica);
}
}
最终结果显示
Helvetica CID TrueType Fully Embedded
但是字体现在根本不显示在 PDF 文件中。我的意思是那些使用字体的地方实际上是空的,空白页......仍然没有东西。
字体本身是从 here
您需要知道资源中当前使用的名称,因此请使用 resources.getFontNames()
2。 要替换标准 14 号字体,请使用此字体对象:
PDTrueTypeFont.load(document, file, oldFont.getEncoding() /* or WinAnsiEncoding.INSTANCE which is usually right */ );
这确保使用与标准 14 字体相同的编码。 (Zapf Dingbats 和 Symbol 字体不同)