Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
  • 한국 커뮤니티
0

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

New Here ,
Jan 21, 2020 Jan 21, 2020

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
2.5K
Translate
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

Community Expert , 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.

Translate
Adobe
Community Expert ,
Jan 21, 2020 Jan 21, 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.

Translate
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

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

 

 

Translate
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

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.

Translate
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

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

Translate
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
Community Expert ,
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.

Translate
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

Thanks too much.

>get Applications fonts list before the document opened.

I couldn't reached this conclusion.

Information on surrogate pair is also appreciated.

 

Translate
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 ,
Nov 26, 2021 Nov 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é

Translate
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
Engaged ,
Jun 06, 2024 Jun 06, 2024

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. 

Translate
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 ,
Jun 10, 2024 Jun 10, 2024
LATEST

@Stefan Rakete

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.

Translate
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