import java.util.Iterator;
import java.util.TreeMap;
import com.spilowagie.text.pdf.PdfArray;
import com.spilowagie.text.pdf.PdfDictionary;
import com.spilowagie.text.pdf.PdfName;
import com.spilowagie.text.pdf.PdfReader;
public class DumpFontNames {
static PdfReader reader;
static TreeMap fontMap = new TreeMap();
static final PdfName F1 = new PdfName("FontFile");
static final PdfName F2 = new PdfName("FontFile2");
static final PdfName F3 = new PdfName("FontFile3");
public static void processResource(PdfDictionary resource) throws Exception {
if (resource == null)
return;
PdfDictionary xos = (PdfDictionary) reader.getPdfObject(resource.get(PdfName.XOBJECT));
if (xos != null) {
for (Iterator it = xos.getKeys().iterator(); it.hasNext();) {
PdfDictionary xo = (PdfDictionary) reader.getPdfObject(xos.get((PdfName) it.next()));
processResource((PdfDictionary) reader.getPdfObject(xo.get(PdfName.RESOURCES)));
}
}
PdfDictionary fonts = (PdfDictionary) reader.getPdfObject(resource.get(PdfName.FONT));
if (fonts == null)
return;
for (Iterator it = fonts.getKeys().iterator(); it.hasNext();) {
PdfDictionary font = (PdfDictionary) reader.getPdfObject(fonts.get((PdfName) it.next()));
String name = ((PdfName) reader.getPdfObject(font.get(PdfName.BASEFONT))).toString();
System.out.println("basefont=" + name);
// System.out.println("name="+reader.getPdfObject(font.get(PdfName.NAME)));
System.out.println("encoding=" + reader.getPdfObject(font.get(PdfName.ENCODING)));
System.out.println("subType=" + reader.getPdfObject(font.get(PdfName.SUBTYPE)));
if (name.length() > 8 && name.charAt(7) == '+') {
name = name.substring(8) + " subset";
} else {
name = name.substring(1);
}
PdfDictionary desc = (PdfDictionary) reader.getPdfObject(font.get(PdfName.FONTDESCRIPTOR));
if (desc == null) {
PdfArray arr = (PdfArray) reader.getPdfObject(font.get(PdfName.DESCENDANTFONTS)); // For Type0 fonts
System.out.println("array=" + arr.getAsDict(0));
desc = (PdfDictionary) reader.getPdfObject(arr.getAsDict(0).get(PdfName.FONTDESCRIPTOR));
}
System.out.println("desc=" + desc);
if (desc != null) {
System.out.println("fontname=" + desc.get(PdfName.FONTNAME));
if (desc.get(F1) != null || desc.get(F2) != null || desc.get(F3) != null)
name += " embedded";
} else
name += " nofontdescriptor";
fontMap.put(name, null);
}
}
public static void main(String[] args) {
try {
reader = new PdfReader("src/test/resources/MyPDF.pdf");
for (int k = 1; k <= reader.getNumberOfPages(); ++k) {
PdfDictionary page = reader.getPageN(k);
processResource((PdfDictionary) reader.getPdfObject(page.get(PdfName.RESOURCES)));
}
for (Iterator it = fontMap.keySet().iterator(); it.hasNext();)
System.out.println((String) it.next());
} catch (Exception e) {
e.printStackTrace();
}
}
}