Welcome Dialog

Welcome to the Community!

We have a brand new look! Take a tour with us and explore the latest updates on Adobe Support Community.


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

New Here ,
Jan 21, 2020 Jan 21, 2020

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.

TOPICS
Scripting

Views

555

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Adobe Community Professional , Jan 22, 2020 Jan 22, 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.

Likes

Translate

Translate
Adobe Community Professional ,
Jan 21, 2020 Jan 21, 2020

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.

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jan 22, 2020 Jan 22, 2020

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

 

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Advocate ,
Jan 22, 2020 Jan 22, 2020

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.

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jan 22, 2020 Jan 22, 2020

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

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe Community Professional ,
Jan 22, 2020 Jan 22, 2020

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.

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jan 22, 2020 Jan 22, 2020

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.

 

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Nov 26, 2021 Nov 26, 2021

Copy link to clipboard

Copied

LATEST

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é

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines