PdfBox embed fonts into existing document

4.8k Views Asked by At

I have a pdf file which shows font properties in Okular (or whatever PDF viewer) like that:

Name: Helvetica 
Type: Type1
File: /usr/share/fonts/truetype/liberation2/LiberationSans-regular.ttf
Embedded: No

I want to embed Helvetica with PDFBox 2xx without modifying file content (text) itself so it would always available with a file. Is it possible at all? I tried something like:

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();

I also tried to call

COSName fontCosName = resources.add(PDType1Font.HELVETICA);
resources.put(fontCosName, font);

What am I doing wrong?

Edit:

@TilmanHausherr thank you for the clue! But I'm still missing something. Currently my code looks like:

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);
    }
}

End result shows Helvetica CID TrueType Fully Embedded But the font is not displayed in PDF file at all now. I mean those places where the font is used are literally empty, blank page... Still something is not there. Font itself was downloaded from here

1

There are 1 best solutions below

2
Tilman Hausherr On BEST ANSWER

You'd need to know the name that is currently used in the resources, so check these with resources.getFontNames()

2. To replace a standard 14 font, use this font object:

PDTrueTypeFont.load(document, file, oldFont.getEncoding() /* or WinAnsiEncoding.INSTANCE which is usually right */ );

this ensures that the same encoding is used as the standard 14 font. (It's different for the Zapf Dingbats and the Symbol font)