Copy link to clipboard
Copied
Hello,
Missing font information with exclamation is shown up in a Missing Fonts dialog in menu Type - Resolve Missing Fonts.
Could you please tell me how to find this informaion using Java Script?
app.textFonts seems not to have this Missing Fonts information.
Thanks in advance.
Sorry, I tried to get Applications fonts and It includes missing fonts when we open documents that have missing fonts.
So, We need to get Applications fonts list before the document opened.
BTW, The contents length sometimes throw incorrect length(ExtendScript does not parse Surrogate Pair), I think to reference characters.length is better.
Copy link to clipboard
Copied
Illustrator's Scripting DOM does not have missing font collection.
You need to list up documents font list and compare it with apps font list.
Copy link to clipboard
Copied
Thank you for your kind reply.
I'd like to confirm what you mean.
documents font list : activeDocument.textFrames[i].story.textRange.characters[j].textFont.name.
apps font list : app.textFonts[i].name.
If my understanding is correct, app.textFont[i].name includes the Missing-Fonts family and name.
Under my condition, KozGoPro-Regular is indicated as a Missing Font in Missing Fonts dialog
with exclamation.
app.textFont[i].family or name reply KozGoPro-Regular as one of 600s fonts name.
My check script is following:
var appFontList = [];
var appFontLen = app.textFonts.length;
for ( var i = 300; i < appFontLen; i++ ) {
appFontList[ app.textFonts[ i ].name ] = 0;
}
var docFontList = [];
var docFontLen = activeDocument.textFrames.length;
for ( i = 0; i < docFontLen; i++ ) {
var charLen = activeDocument.textFrames[ i ].story.textRange.contents.length;
for ( var j = 0; j < charLen; j++ ) {
var fontName = app.activeDocument.textFrames[ i ].story.textRange.characters[ j ].textFont.family;
if ( appFontList[ fontName ] != 0 ) {
alert( fontName );
}
}
}
Could you give us any advice?
Illustrator CC2020
Copy link to clipboard
Copied
Are you just trying to see a full list of missing fonts? To do so, go to "Type"..."Find Font", then in the dialog box, select "Save List". It will save a text file which you can open to view the missing fonts.
Copy link to clipboard
Copied
Thank you for your kind support.
Final purpose of scripting is to convert text to outline.
Beforhand the converting, want to check if missing font exists or not.
DOM has not missing font collection.
app.textFonts seems to have missing font collection.
If this is correct, comparing app font lists and document font lists is no meaning to check.
Current situation is above.
My posted code has some mispoints.
Retry to post. Very sorry.
var appFontList = [];
for ( var i = 0; i < app.textFonts.length; i++ ) {
appFontList[ app.textFonts[i].name ] = 0;
}
var docFontList = [];
for ( i = 0; i < activeDocument.textFrames.length; i++ ) {
var charLen = activeDocument.textFrames[i].story.textRange.contents.length;
for ( var j = 0; j < charLen; j++ ) {
var fontName = app.activeDocument.textFrames[i].story.textRange.characters[j].textFont.name;
if ( appFontList[ fontName ] != 0 ) {
alert( fontName );
}
}
}
Copy link to clipboard
Copied
Sorry, I tried to get Applications fonts and It includes missing fonts when we open documents that have missing fonts.
So, We need to get Applications fonts list before the document opened.
BTW, The contents length sometimes throw incorrect length(ExtendScript does not parse Surrogate Pair), I think to reference characters.length is better.
Copy link to clipboard
Copied
Thanks too much.
>get Applications fonts list before the document opened.
I couldn't reached this conclusion.
Information on surrogate pair is also appreciated.
Copy link to clipboard
Copied
Bonjour!
Peut-être que je peux aider avec ce script ?
// JavaScript Document for Illustrator
// missing font.js
// Thu, 18 November 2021 08:50:59 GMT
// Modif Landry R
/* Donne la liste des polices utilisées dans le document actif
ainsi que la liste des polices qui n'existent pas dans le système.*/
// INIT ---------------
var info = false; var sep = ";"; var fntInfoStr;
//---------------------
var docRef = app.activeDocument;
var docName = docRef.name;
var dest = File.decode(docRef.fullName); // alert(dest)
docRef.close(SaveOptions.DONOTSAVECHANGES);
docRef = null;
var doctest = app.documents.add();
var sFontNames = getSysFonts(sep); // string
docRef = open(new File(dest));
//alert(sFontNames.substring(0,200))
var fonts = getFntsLst(docRef); // array
var result = [];
for (var i = 0;i < fonts.length; i++) {
if (sFontNames.indexOf(sep+fonts[i]+sep) != -1) {
st += fonts[i] + " <found in system>\r";
}
else {
st += fonts[i] + " >not found in system<\r";
result.push(i+1)
}
}
var defaut = result.length > 0 ? "DEFAULT!! ligne(s) "+result.join(' ')+"\r" : "";
alert(defaut+st);
if (info) {
docRef.artboards.setActiveArtboardIndex(0)
var abRect = docRef.artboards[0].artboardRect;
var origX = abRect[0], origY = abRect[1], H = abRect[1]-abRect[3];
var rectRef = docRef.pathItems.rectangle(origY+H,origX-950,650, 1200);
var text = docRef.textFrames.pointText([origX-200,origY-20]);
text.contents = fonts.join("\r");
text = docRef.textFrames.areaText(rectRef);
text.contents = sFontNames.replace(/;/g," "); // sysFtStr
text.textRange.size = 11.5;
text = docRef.textFrames.pointText([origX-200,origY-120]); // st
text.contents = defaut+st;
text = docRef.textFrames.pointText([origX-200,origY-320]); // fntInfoStr
text.contents = fntInfoStr;
}
doctest.close(SaveOptions.DONOTSAVECHANGES);
// -------
function getFntsLst (doc){
// return list array fonts doc
var xmlString = new XML(doc.XMPString);
var fontsInfo = xmlString.descendants("stFnt:fontName");
fntInfoStr = fontsInfo.toString();
var lst = [];
for (var i = 0; i < fontsInfo.length(); i++) {
lst.push(fontsInfo[i]);
}
return lst;
}
// -------
function getSysFonts(sep){
// string list fonts system (sep space))
var sFontNames = sep;
var iCount = app.textFonts.length;
for(j = 0; j < iCount; j++) {
sFontNames += textFonts[j].name+sep;
}
return sFontNames;
}
// -------
René
Copy link to clipboard
Copied
Merci for you script. It is very helpful to identify Illustrator documents with missing or wrong fonts.
I would like to understand why the docRef needs to be closed and then opened again to get the correct result.
Copy link to clipboard
Copied
The list of font names is taken from the document metadata XMP, so it will only be correct when the document is saved.
Probably closing and opening it again is a way to be sure that the XMP is up-to-date. I sometimes substitute that by checking Document.saved.