//
// pdffonts.cc
//
-// Copyright 2001-2002 Glyph & Cog, LLC
+// Copyright 2001-2003 Glyph & Cog, LLC
//
//========================================================================
static int firstPage = 1;
static int lastPage = 0;
-static char ownerPassword[33] = "";
-static char userPassword[33] = "";
+static char ownerPassword[33] = "\001";
+static char userPassword[33] = "\001";
static char cfgFileName[256] = "";
static GBool printVersion = gFalse;
static GBool printHelp = gFalse;
Annots *annots;
Object obj1, obj2;
int pg, i;
+ int exitCode;
+
+ exitCode = 99;
// parse args
ok = parseArgs(argDesc, &argc, argv);
if (!ok || argc != 2 || printVersion || printHelp) {
- fprintf(stderr, "pdfinfo version %s\n", xpdfVersion);
+ fprintf(stderr, "pdffonts version %s\n", xpdfVersion);
fprintf(stderr, "%s\n", xpdfCopyright);
if (!printVersion) {
- printUsage("pdfinfo", "<PDF-file>", argDesc);
+ printUsage("pdffonts", "<PDF-file>", argDesc);
}
- exit(1);
+ goto err0;
}
fileName = new GString(argv[1]);
globalParams = new GlobalParams(cfgFileName);
// open PDF file
- if (ownerPassword[0]) {
+ if (ownerPassword[0] != '\001') {
ownerPW = new GString(ownerPassword);
} else {
ownerPW = NULL;
}
- if (userPassword[0]) {
+ if (userPassword[0] != '\001') {
userPW = new GString(userPassword);
} else {
userPW = NULL;
delete ownerPW;
}
if (!doc->isOk()) {
- exit(1);
+ exitCode = 1;
+ goto err1;
}
// get page range
delete annots;
}
+ exitCode = 0;
+
// clean up
gfree(fonts);
+ err1:
delete doc;
delete globalParams;
+ err0:
// check for memory leaks
Object::memCheck(stderr);
gMemReport(stderr);
- return 0;
+ return exitCode;
}
static void scanFonts(Dict *resDict, PDFDoc *doc) {
+ Object obj1, obj2, xObjDict, xObj, resObj;
+ Ref r;
GfxFontDict *gfxFontDict;
GfxFont *font;
- Object fontDict, xObjDict, xObj, resObj;
int i;
// scan the fonts in this resource dictionary
- resDict->lookup("Font", &fontDict);
- if (fontDict.isDict()) {
- gfxFontDict = new GfxFontDict(doc->getXRef(), fontDict.getDict());
+ gfxFontDict = NULL;
+ resDict->lookupNF("Font", &obj1);
+ if (obj1.isRef()) {
+ obj1.fetch(doc->getXRef(), &obj2);
+ if (obj2.isDict()) {
+ r = obj1.getRef();
+ gfxFontDict = new GfxFontDict(doc->getXRef(), &r, obj2.getDict());
+ }
+ obj2.free();
+ } else if (obj1.isDict()) {
+ gfxFontDict = new GfxFontDict(doc->getXRef(), NULL, obj1.getDict());
+ }
+ if (gfxFontDict) {
for (i = 0; i < gfxFontDict->getNumFonts(); ++i) {
- font = gfxFontDict->getFont(i);
- scanFont(font, doc);
+ if ((font = gfxFontDict->getFont(i))) {
+ scanFont(font, doc);
+ }
}
delete gfxFontDict;
}
- fontDict.free();
+ obj1.free();
// recursively scan any resource dictionaries in objects in this
// resource dictionary
static void scanFont(GfxFont *font, PDFDoc *doc) {
Ref fontRef, embRef;
- Object fontObj, nameObj, toUnicodeObj;
+ Object fontObj, toUnicodeObj;
GString *name;
- GBool subset, hasToUnicode;
+ GBool emb, subset, hasToUnicode;
int i;
fontRef = *font->getID();
}
}
- // get the original font name -- the GfxFont class munges substitute
- // Base-14 font names into proper form, so this code grabs the
- // original name from the font dictionary; also look for a ToUnicode
- // map
- name = NULL;
+ // font name
+ name = font->getOrigName();
+
+ // check for an embedded font
+ if (font->getType() == fontType3) {
+ emb = gTrue;
+ } else {
+ emb = font->getEmbeddedFontID(&embRef);
+ }
+
+ // look for a ToUnicode map
hasToUnicode = gFalse;
if (doc->getXRef()->fetch(fontRef.num, fontRef.gen, &fontObj)->isDict()) {
- if (fontObj.dictLookup("BaseFont", &nameObj)->isName()) {
- name = new GString(nameObj.getName());
- }
- nameObj.free();
hasToUnicode = fontObj.dictLookup("ToUnicode", &toUnicodeObj)->isStream();
toUnicodeObj.free();
}
}
// print the font info
- printf("%-36s %-12s %-3s %-3s %-3s %6d %2d\n",
+ printf("%-36s %-12s %-3s %-3s %-3s",
name ? name->getCString() : "[none]",
fontTypeNames[font->getType()],
- font->getEmbeddedFontID(&embRef) ? "yes" : "no",
+ emb ? "yes" : "no",
subset ? "yes" : "no",
- hasToUnicode ? "yes" : "no",
- fontRef.num, fontRef.gen);
- if (name) {
- delete name;
+ hasToUnicode ? "yes" : "no");
+ if (fontRef.gen >= 100000) {
+ printf(" [none]\n");
+ } else {
+ printf(" %6d %2d\n", fontRef.num, fontRef.gen);
}
// add this font to the list