Skip to main content
Participant
January 22, 2020
Answered

How can I find existence of missing fonts using java script?

  • January 22, 2020
  • 3 replies
  • 2681 views

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.

This topic has been closed for replies.
Correct answer Ten A

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.

3 replies

Ten A
Community Expert
Ten ACommunity ExpertCorrect answer
Community Expert
January 23, 2020

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.

ry1006Author
Participant
January 23, 2020

Thanks too much.

>get Applications fonts list before the document opened.

I couldn't reached this conclusion.

Information on surrogate pair is also appreciated.

 

renél80416020
Inspiring
November 26, 2021

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é

meganchi
Legend
January 22, 2020

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.

ry1006Author
Participant
January 23, 2020

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

Ten A
Community Expert
Community Expert
January 22, 2020

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.

ry1006Author
Participant
January 22, 2020

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