SignDoc SDK (.NET without exceptions)  5.0.0
<?xml version="1.0" encoding="UTF-8"?>
<!-- A font configuration file specifies font files and and font
     substitutions. See SPFontConfig-Noto.xml for a font configuration
     file that tries to cover all Noto fonts. -->
<!ELEMENT SPFontConfig (FontFiles*, Flag*, Substitution*)>

<!-- Load fonts from files. The contents of this element specify
     either the pathname of a single font or a pathname containing
     wildcard characters "*" and "?" in the last component such as
     c:\fonts\*.ttf.  Relative pathnames are relative to the directory
     containing the font configuration file. If font configuration is
     read from a stream, relative pathnames will be relative to a
     specified directory. If no directory is specified, "FontFiles"
     elements with relative pathnames will be ignored.

     The "embed" attribute controls whether the fonts will be embedded
     into the document or not.  If a font is already embedded and contains
     all required glyphs, it won't be embedded again. These values are
     available:
       no       The fonts won't be embedded; this is not allowed unless
                explicitly overriden with setShootInFoot().
       yes      The fonts will be embedded completely.
       subset   Only the required glyphs will be embedded.
     The "Substitution" element can override this attribute.
     Note that documents compliant with PDF/A must embed all fonts
     (subsetted or not).

     The "family" attribute overrides the family name for the fonts. If this
     attribute is missing or if its value is empty, the family names are
     taken from the font files.

     The "features" attribute can be used to disable font features
     such as ligatures. Its value is a HarfBuzz feature string, see
     https://github.com/deepakjois/luaharfbuzz/wiki/Feature-Strings.

     The "raw-cff" attribute is used to control how OpenType fonts
     with CFF outlines will be embedded. If its value is "no", those
     fonts will be embedded as OpenType fonts. If its value is "yes",
     those fonts will be embedded as Type1 CFF fonts. If the PDF
     document claims to conform to PDF/A-1 or if the PDF version of
     the PDF document is 1.4 or less, the "raw-cff" will be ignored
     and OpenType fonts with CFF outlines will be embedded as Type1
     CFF fonts. -->
<!ELEMENT FontFiles (#PCDATA)>
<!ATTLIST FontFiles
    embed (no|yes|subset) "subset"
    family CDATA #IMPLIED
    features CDATA #IMPLIED
    raw-cff (no|yes) "yes"
>

<!-- Define one flag derived from font names. Flags can be used to
     avoid repeating font names over and over (for instance to select
     serif fonts by name) and for testing values in the font
     descriptor of fonts already existing in the PDF document and to
     be substituted. If the font name to be substituted matches a
     "FontName" element of a "Flag" element or if at least one of the
     conditions is met, the flag named by the "name" attribute will be
     set. The "name" attribute must start with an ASCII letter and can
     contain only ASCII letters, ASCII digits, and hyphens. See the
     "flags" attribute of the "Substitution" element. -->
<!ELEMENT Flag ((FontName|Condition)+)>
<!ATTLIST Flag name CDATA
    #REQUIRED
>

<!-- Defines one font substitution. Font substitutions are tried one
     by one until a match is found or the end is reached.  Letter case
     and space characters are ignored in font names. The output of a
     substitution rule is never used as input for another rule.

     Font substitution for a font named A is performed using these steps:
     - (1) Apply the first matching font substitution of type "forced",
       resulting in font name B. If there is no such substitution,
       using A as B.
     - (2) Search the font files specified by "FontFiles" elements,
       fonts already embedded in the document, and standard fonts for
       a font named B that covers all required characters and
       scripts. For complex scripts, the font must have GSUB/GPOS
       tables (ie, standard fonts cannot be used). If there is such a
       font, use that font.
     - (3) Apply the first matching font substitution of type "fallback",
       matching against font A (ie, ignoring any "forced" substitution).
       Give up if there is no such font substitution.
     - (4) If the font substitution results in a single font C, search
       the font files specified by "FontFiles" elements, fonts already
       embedded in the document, and standard fonts for a font named C
       that covers all required characters and scripts. For complex
       scripts, the font must have GSUB/GPOS tables (ie, standard
       fonts cannot be used). If there is such a font, use that font.
     - (5) If the font substitution results in multiple font names D,
       check if there is a font file specified by "FontFiles" elements
       that has a name in D and that covers all required characters and
       scripts. If there is such a font file, use that font. Otherwise,
       try to find a set of font files specified by "FontFiles" elements
       having names in D that covers all required characters and scripts.
       If there is such a subset, use those fonts.
     - (6) Give up if the text uses just one script.
     - (7) Partition the text into segments based on scripts. For each
           script, repeat steps (1) through (6), trying to find a font
           or a set of fonts covering all the characters of that script.
           On failure, try steps (1) through (6) again without requiring
           GPOS/GSUB tables. Give up if there is a script for which no
           suitable font is found.
     .
     If a suitable substitution is found before step (7), exactly one
     substitution will be applied. If step (7) is needed and succeeds,
     at most one substitution per script will be applied. Using step (7)
     is the only way to apply multiple font substitutions for a single
     text.

     For embedded fonts and font files, the font name will be matched
     against the PostScript names and font family names.  In the
     latter case, the italic and bold attributes of the fonts are also
     compared.

     There are two types of font substitutions: If the "type"
     attribute is "forced", the substitution will be applied before
     trying to locate the font. That way, a font can be substituted
     even if it is already embedded and covers all required
     characters. A substitution rule of this type must have exactly
     two "FontName" elements and no "Script" element. (Usage of
     forced substitutions is not recommended.)

     If the "type" attribute is "fallback", the substitution will be
     applied only if no standard font, already-embedded font, or font
     loaded by "FontFiles" elements covers all required characters and
     scripts as described above. The substitution will be applied to
     the original font name, ie, without taking a substitution of type
     "forced" into account.

     If two "FontName" elements (without "Script" element) are
     provided, substitute the first font with the second one. "*" in
     the first "FontName" element matches any sequence of characters
     in the font name (including no characters).

     If a "Script" element is used, the "FontName" elements before the
     "Script" element specify the fonts to be substituted (at least
     one of the font names must match), the "FontName" elements after
     the "Script" element specifies the replacement fonts. "*" in the
     "FontName" elements before the "Script" element matches any
     sequence of characters in the font name (including no
     characters). Using multiple "FontName" elements before the
     "Script" element is equivalent to using one "Substitution"
     element per such "FontName" element.

     If there is a single "FontName" element specifying a replacement
     font, that font is searched for in the PDF document, in the
     standard fonts, and in the font files; it must cover all required
     characters for the specified scripts. If there are multiple
     "FontName" elements specifying replacement fonts, only font files
     will be searched for matching fonts. If one of those font files
     coveres all required characters for the specified scripts, the
     first one of those font files will be used.  Otherwise, a subset
     of the font files must together cover all required characters for
     the specified script. (The algorithm for computing that subset is
     undefined.) Substitution rules having multiple replacement fonts
     cannot be rewritten as substitution rules having one replacement
     font.

     If there is a "Script" element, use the substitution for the
     specified scripts only (in that case, the "FontName" elements
     before the "Script" element should use wildcard patterns).
     Using a "Script" element with multiple script tags is equivalent
     to using one "Substitution" element per script tag.

     It is recommended to restrict substitution rules with "Script"
     elements in order to avoid accidentally using generic Latin
     glyphs from, say, CJK fonts.

     If the "flags" attribute has a non-empty value, it specifies a
     comma-separated list of flags. Each flag can be preceded by a "!"
     character to negate its value. The substitution is applied only
     if all flags not preceded by "!" are set and all flags preceded
     by "!" are not set. The flag names are case-sensitive.  All flags
     used in "flags" attributes must be defined by "Flag" elements.

     The "embed" attribute controls whether the font will be
     embedded into the document or not.  If a font is already
     embedded and contains all required glyphs, it won't be
     embedded again. These values are available:
       default  Use the "embed" attribute of the "FontFiles" element for the
                substituted font
       no       The font won't be embedded; this is not allowed unless
                explicitly overriden with setShootInFoot()
       yes      The font will be embedded completely
       subset   Only the required glyphs will be embedded
     The "no", "yes", and "subset" values override the "embed" attribute
     of the "FontFiles" element for the substituted font.
     Note that documents compliant with PDF/A must embed all fonts
     (subsetted or not).

     The sequence of substitution rules matters as the first matching
     one will be used. You can use this behavior to map font names
     ending with "Bold" (<FontName>*Bold</FontName) to a bold font and
     (in a subsequent rule) all other font names
     (<FontName>*</FontName>) to a regular font.

     When using a font configuration file for configuring fonts to be
     used for rendering PDF documents, only substitutions using
     exactly one target "FontName" element and only source "FontName"
     elements that don't contain any "*" characters take effect.
     The "Script" element will be ignored. All attributes
     of "FontName" elements will be ignored. "Substitution" elements
     having a "type" attribute with value "forced" take precedence
     over "Substitution" elements having a "type" attribute of
     "fallback", all other attributes of "Substitution" elements are
     ignored. -->
<!ELEMENT Substitution ((FontName, FontName) | (FontName+, Script, FontName+))>
<!ATTLIST Substitution
    flags CDATA #IMPLIED
    type (forced|fallback) "fallback"
    embed (default|no|yes|subset) "default"
>

<!-- Contents: the font family name or PostScript name of the font to be
     substituted or of the font used as substitute. -->
<!ELEMENT FontName (#PCDATA)>

<!-- A condition for the "Flag" element. The contents are an
     expression of the form "LHS OP RHS", where LHS specifies a
     number-valued entry (such as FontWeight, ItalicAngle, or StemV)
     in the font descriptor, OP specifies a comparison operator:
       LT       LHS is less than RHS
       LE       LHS is less than or equal to RHS
       EQ       LHS equals RHS
       NE       LHS does not equal RHS
       GE       LHS is greater than or equal to RHS
       GT       LHS is greater than RHS
       BITSET   Bit RHS (1 through 31) is set in LHS (which should be "Flags")
       BITCLEAR Bit RHS (1 through 31) is not set in LHS (which should
                be "Flags")
     RHS is the number against which the entry's value shall be
     compared or the bit number (for BITSET and BITCLEAR). Note
     that bits are numbered as in the PDF specification: bit 1
     is the least significant bit.
     If the entry does not exist and no default value is
     defined for it, the condition won't be met.

     Examples:

     <Flag name="italic">
       <Condition>ItalicAngle LE -2</Condition>
       <Condition>Flags BITSET 7</Condition>
     </Flag>
     <Flag name="bold">
       <Condition>FontWeight GE 500</Condition>
     </Flag>

     Note that the values of StemV and Flags are usually unreliable.
     Note that a value of 0 for StemV or StemH means that the value
     is unknown.-->
<!ELEMENT Condition (#PCDATA)>

<!-- Contents: space-separated OpenType script tags of the font to be
     substituted:
       arab    Arabic
       armi    Imperial Aramaic
       armn    Armenian
       avst    Avestan
       bali    Balinese
       bamu    Bamum
       bass    Bassa Vah
       batk    Batak
       beng    Bengali
       bopo    Bopomofo
       brah    Brahmi
       brai    Braille
       bugi    Buginese
       buhd    Buhid
       cakm    Chakma
       cans    Canadian Syllabics
       cari    Carian
       cham    Cham
       cher    Cherokee
       copt    Coptic
       cprt    Cypriot Syllabary
       cyrl    Cyrillic
       deva    Devanagari
       dsrt    Deseret
       dupl    Duployan
       egyp    Egyptian Hieroglyphs
       elba    Elbasan
       ethi    Ethiopic
       geor    Georgian
       glag    Glagolitic
       goth    Gothic
       gran    Grantha
       grek    Greek
       gujr    Gujarati
       guru    Gurmukhi
       hang    Hangul
       hani    CJK Ideographic
       hano    Hanunoo
       hebr    Hebrew
       hluw    Anatolian Hieroglyphs
       hmng    Pahawh Hmong
       hung    Old Hungarian
       ital    Old Italic
       java    Javanese
       kali    Kayah Li
       kana    Hiragana
       khar    Kharosthi
       khmr    Khmer
       khoj    Khojki
       knda    Kannada
       kthi    Kaithi
       lana    Tai Tham (Lanna)
       lao     Lao
       latn    Latin
       lepc    Lepcha
       limb    Limbu
       lina    Linear A
       linb    Linear B
       lisu    Lisu (Fraser)
       lyci    Lycian
       lydi    Lydian
       mand    Mandaic, Mandaean
       mani    Manichaean
       math    Mathematical Alphanumeric Symbols
       mend    Mende Kikakui
       merc    Meroitic Cursive
       mero    Meroitic Hieroglyphs
       mlym    Malayalam
       modi    Modi
       mong    Mongolian
       mroo    Mro
       mtei    Meitei Mayek (Meithei, Meetei)
       musc    Musical Symbols
       mymr    Myanmar
       narb    Old North Arabian
       nbat    Nabataean
       nko     N'Ko
       ogam    Ogham
       olck    Ol Chiki
       orkh    Old Turkic, Orkhon Runic
       orya    Odia (formerly Oriya)
       osma    Osmanya
       palm    Palmyrene
       perm    Old Permic
       phag    Phags-pa
       phli    Inscriptional Pahlavi
       phlp    Psalter Pahlavi
       phnx    Phoenician
       plrd    Miao
       prti    Inscriptional Parthian
       rjng    Rejang
       runr    Runic
       samr    Samaritan
       sarb    Old South Arabian
       saur    Saurashtra
       sgnw    Sign Writing
       shaw    Shavian
       shrd    Sharada
       sind    Khudawadi
       sinh    Sinhala
       sora    Sora Sompeng
       sund    Sundanese
       sylo    Syloti Nagri
       syrc    Syriac
       tagb    Tagbanwa
       takr    Takri
       tale    Tai Le
       talu    New Tai Lue
       taml    Tamil
       tavt    Tai Viet
       telu    Telugu
       tfng    Tifinagh
       tglg    Tagalog
       thaa    Thaana
       thai    Thai
       tibt    Tibetan
       tirh    Tirhuta
       ugar    Ugaritic Cuneiform
       vai     Vai
       wara    Warang Citi
       xpeo    Old Persian Cuneiform
       xsux    Sumero-Akkadian Cuneiform
       yi      Yi
     Additionally, script tag "OTHR" is used for code points not
     covered by the above scripts.

     If the value of a text field is empty, script tag "latn" will be
     used. In consequence, if you use the "Script" element, you should
     always have a rule for script tag "latn".

     If the content of the "Script" element is empty, all scripts will
     match, that is, an empty "Script" element behaves like a missing
     "Script" element (except for syntactically separating "FontName"
     elements). -->
<!ELEMENT Script (#PCDATA)>