com.lowagie.text.pdf

Class CFFFontSubset

public class CFFFontSubset extends CFFFont

This Class subsets a CFF Type Font. The subset is preformed for CID fonts and NON CID fonts. The Charstring is subsetted for both types. For CID fonts only the FDArray which are used are embedded. The Lsubroutines of the FDArrays used are subsetted as well. The Subroutine subset supports both Type1 and Type2 formatting although only tested on Type2 Format. For Non CID the Lsubroutines are subsetted. On both types the Gsubroutines is subsetted. A font which was not of CID type is transformed into CID as a part of the subset process. The CID synthetic creation was written by Sivan Toledo (sivan@math.tau.ac.il)

Author: Oren Manor (manorore@post.tau.ac.il) and Ygal Blum (blumygal@post.tau.ac.il)

Field Summary
static byteENDCHAR_OP
Operator codes for unused CharStrings and unused local and global Subrs
HashMapFDArrayUsed
A HashMap for keeping the FDArrays being used by the font
ArrayListglyphsInList
The GlyphsUsed keys as an ArrayList
intGBias
The bias for the global subroutines
HashMapGlyphsUsed
A HashMap containing the glyphs used in the text after being converted to glyph number by the CMap
HashMaphGSubrsUsed
A HashMap for keeping the Global subroutines used in the font
HashMap[]hSubrsUsed
A HashMaps array for keeping the subroutines used in each FontDict
HashMaphSubrsUsedNonCID
A HashMap for keeping the subroutines used in a non-cid font
ArrayListlGSubrsUsed
The Global SubroutinesUsed HashMaps as ArrayLists
ArrayList[]lSubrsUsed
The SubroutinesUsed HashMaps as ArrayLists
ArrayListlSubrsUsedNonCID
The SubroutinesUsed HashMap as ArrayList
byte[]NewCharStringsIndex
The new CharString of the font
byte[]NewGSubrsIndex
The new global subroutines index of the font
byte[][]NewLSubrsIndex
An array of the new Indexes for the local Subr.
byte[]NewSubrsIndexNonCID
The new subroutines index for a non-cid font
intNumOfHints
Number of arguments to the stem operators in a subroutine calculated recursively
LinkedListOutputList
The linked list for generating the new font stream
static byteRETURN_OP
static String[]SubrsEscapeFuncs
The Strings in this array represent Type1/Type2 escape operator names
static String[]SubrsFunctions
The Strings in this array represent Type1/Type2 operator names
Constructor Summary
CFFFontSubset(RandomAccessFileOrArray rf, HashMap GlyphsUsed)
C'tor for CFFFontSubset
Method Summary
protected byte[]AssembleIndex(int[] NewOffsets, byte[] NewObjects)
Function creates the new index, inserting the count,offsetsize,offset array and object array.
protected voidBuildFDArrayUsed(int Font)
Function reads the FDSelect and builds the FDArrayUsed HashMap According to the glyphs used
protected voidBuildFDSubrsOffsets(int Font, int FD)
The function finds for the FD array processed the local subr offset and its offset array.
protected voidBuildGSubrsUsed(int Font)
Function scans the Glsubr used ArrayList to find recursive calls to Gsubrs and adds to Hashmap & ArrayList
protected voidBuildIndexHeader(int Count, int Offsize, int First)
Function Build the header of an index
protected voidBuildNewCharString(int FontIndex)
Function uses BuildNewIndex to create the new index of the subset charstrings
protected byte[]BuildNewFile(int Font)
The function builds the new output stream according to the subset process
protected byte[]BuildNewIndex(int[] Offsets, HashMap Used, byte OperatorForUnusedEntries)
Function builds the new offset array, object array and assembles the index. used for creating the glyph and subrs subsetted index
protected voidBuildNewLGSubrs(int Font)
Function builds the new local & global subsrs indices.
protected voidBuildSubrUsed(int Font, int FD, int SubrOffset, int[] SubrsOffsets, HashMap hSubr, ArrayList lSubr)
Function uses ReadAsubr on the glyph used to build the LSubr & Gsubr HashMap.
protected intcountEntireIndexRange(int indexOffset)
Function computes the size of an index
protected intCalcBias(int Offset, int Font)
Function calcs bias according to the CharString type and the count of the subrs
protected intCalcHints(int begin, int end, int LBias, int GBias, int[] LSubrsOffsets)
The function reads the subroutine and returns the number of the hint in it.
intCalcSubrOffsetSize(int Offset, int Size)
Calculates how many byte it took to write the offset for the subrs in a specific private dict.
protected voidCopyHeader()
Function Copies the header from the original fileto the output list
intCountCharset(int Offset, int NumofGlyphs)
Calculates the length of the charset according to its format
intCountRange(int NumofGlyphs, int Type)
Function calculates the number of ranges in the Charset
protected voidCreateCharset(OffsetItem charsetRef, int nglyphs)
Function creates new CharSet for non-CID fonts.
protected voidCreateFDArray(OffsetItem fdarrayRef, OffsetItem privateRef, int Font)
Function creates new FDArray for non-CID fonts.
protected voidCreateFDSelect(OffsetItem fdselectRef, int nglyphs)
Function creates new FDSelect for non-CID fonts.
protected voidCreateKeys(OffsetItem fdarrayRef, OffsetItem fdselectRef, OffsetItem charsetRef, OffsetItem charstringsRef)
Function adds the keys into the TopDict
protected voidCreateNewStringIndex(int Font)
Function takes the original string item and adds the new strings to accommodate the CID rules
voidCreateNonCIDPrivate(int Font, OffsetItem Subr)
The function creates a private dict for a font that was not CID All the keys are copied as is except for the subrs key
voidCreateNonCIDSubrs(int Font, IndexBaseItem PrivateBase, OffsetItem Subrs)
the function marks the beginning of the subrs index and adds the subsetted subrs index to the output list.
protected voidEmptyStack()
Empty the Type2 Stack
protected voidHandelStack()
Function Checks how the current operator effects the run time stack after being run An operator may increase or decrease the stack size
protected voidPopStack()
Pop one element from the stack
byte[]Process(String fontName)
The Process function extracts one font out of the CFF file and returns a subset version of the original.
protected voidPushStack()
Add an item to the stack
protected voidreadFDSelect(int Font)
Read the FDSelect of the font and compute the array and its length
protected voidReadASubr(int begin, int end, int GBias, int LBias, HashMap hSubr, ArrayList lSubr, int[] LSubrsOffsets)
The function reads a subrs (glyph info) between begin and end.
protected voidReadCommand()
The function reads the next command after the file pointer is set
protected voidReadFDArray(int Font)
Read the FDArray count, offsize and Offset array
voidReconstruct(int Font)
Function reconstructs the FDArray, PrivateDict and LSubr for CID fonts
voidReconstructFDArray(int Font, OffsetItem[] fdPrivate)
Function subsets the FDArray and builds the new one with new offsets
voidReconstructPrivateDict(int Font, OffsetItem[] fdPrivate, IndexBaseItem[] fdPrivateBase, OffsetItem[] fdSubrs)
Function Adds the new private dicts (only for the FDs used) to the list
voidReconstructPrivateSubrs(int Font, IndexBaseItem[] fdPrivateBase, OffsetItem[] fdSubrs)
Function Adds the new LSubrs dicts (only for the FDs used) to the list
protected intStackOpp()
Function checks the key and return the change to the stack after the operator

Field Detail

ENDCHAR_OP

static final byte ENDCHAR_OP
Operator codes for unused CharStrings and unused local and global Subrs

FDArrayUsed

HashMap FDArrayUsed
A HashMap for keeping the FDArrays being used by the font

glyphsInList

ArrayList glyphsInList
The GlyphsUsed keys as an ArrayList

GBias

int GBias
The bias for the global subroutines

GlyphsUsed

HashMap GlyphsUsed
A HashMap containing the glyphs used in the text after being converted to glyph number by the CMap

hGSubrsUsed

HashMap hGSubrsUsed
A HashMap for keeping the Global subroutines used in the font

hSubrsUsed

HashMap[] hSubrsUsed
A HashMaps array for keeping the subroutines used in each FontDict

hSubrsUsedNonCID

HashMap hSubrsUsedNonCID
A HashMap for keeping the subroutines used in a non-cid font

lGSubrsUsed

ArrayList lGSubrsUsed
The Global SubroutinesUsed HashMaps as ArrayLists

lSubrsUsed

ArrayList[] lSubrsUsed
The SubroutinesUsed HashMaps as ArrayLists

lSubrsUsedNonCID

ArrayList lSubrsUsedNonCID
The SubroutinesUsed HashMap as ArrayList

NewCharStringsIndex

byte[] NewCharStringsIndex
The new CharString of the font

NewGSubrsIndex

byte[] NewGSubrsIndex
The new global subroutines index of the font

NewLSubrsIndex

byte[][] NewLSubrsIndex
An array of the new Indexes for the local Subr. One index for each FontDict

NewSubrsIndexNonCID

byte[] NewSubrsIndexNonCID
The new subroutines index for a non-cid font

NumOfHints

int NumOfHints
Number of arguments to the stem operators in a subroutine calculated recursively

OutputList

LinkedList OutputList
The linked list for generating the new font stream

RETURN_OP

static final byte RETURN_OP

SubrsEscapeFuncs

static final String[] SubrsEscapeFuncs
The Strings in this array represent Type1/Type2 escape operator names

SubrsFunctions

static final String[] SubrsFunctions
The Strings in this array represent Type1/Type2 operator names

Constructor Detail

CFFFontSubset

public CFFFontSubset(RandomAccessFileOrArray rf, HashMap GlyphsUsed)
C'tor for CFFFontSubset

Parameters: rf - The font file GlyphsUsed - a HashMap that contains the glyph used in the subset

Method Detail

AssembleIndex

protected byte[] AssembleIndex(int[] NewOffsets, byte[] NewObjects)
Function creates the new index, inserting the count,offsetsize,offset array and object array.

Parameters: NewOffsets the subsetted offset array NewObjects the subsetted object array

Returns: the new index created

BuildFDArrayUsed

protected void BuildFDArrayUsed(int Font)
Function reads the FDSelect and builds the FDArrayUsed HashMap According to the glyphs used

Parameters: Font the Number of font being processed

BuildFDSubrsOffsets

protected void BuildFDSubrsOffsets(int Font, int FD)
The function finds for the FD array processed the local subr offset and its offset array.

Parameters: Font the font FD The FDARRAY processed

BuildGSubrsUsed

protected void BuildGSubrsUsed(int Font)
Function scans the Glsubr used ArrayList to find recursive calls to Gsubrs and adds to Hashmap & ArrayList

Parameters: Font the font

BuildIndexHeader

protected void BuildIndexHeader(int Count, int Offsize, int First)
Function Build the header of an index

Parameters: Count the count field of the index Offsize the offsize field of the index First the first offset of the index

BuildNewCharString

protected void BuildNewCharString(int FontIndex)
Function uses BuildNewIndex to create the new index of the subset charstrings

Parameters: FontIndex the font

Throws: IOException

BuildNewFile

protected byte[] BuildNewFile(int Font)
The function builds the new output stream according to the subset process

Parameters: Font the font

Returns: the subsetted font stream

BuildNewIndex

protected byte[] BuildNewIndex(int[] Offsets, HashMap Used, byte OperatorForUnusedEntries)
Function builds the new offset array, object array and assembles the index. used for creating the glyph and subrs subsetted index

Parameters: Offsets the offset array of the original index Used the hashmap of the used objects OperatorForUnusedEntries the operator inserted into the data stream for unused entries

Returns: the new index subset version

Throws: IOException

BuildNewLGSubrs

protected void BuildNewLGSubrs(int Font)
Function builds the new local & global subsrs indices. IF CID then All of the FD Array lsubrs will be subsetted.

Parameters: Font the font

Throws: IOException

BuildSubrUsed

protected void BuildSubrUsed(int Font, int FD, int SubrOffset, int[] SubrsOffsets, HashMap hSubr, ArrayList lSubr)
Function uses ReadAsubr on the glyph used to build the LSubr & Gsubr HashMap. The HashMap (of the lsubr only) is then scanned recursively for Lsubr & Gsubrs calls.

Parameters: Font the font FD FD array processed. 0 indicates function was called by non CID font SubrOffset the offset to the subr index to calc the bias SubrsOffsets the offset array of the subr index hSubr HashMap of the subrs used lSubr ArrayList of the subrs used

countEntireIndexRange

protected int countEntireIndexRange(int indexOffset)
Function computes the size of an index

Parameters: indexOffset The offset for the computed index

Returns: The size of the index

CalcBias

protected int CalcBias(int Offset, int Font)
Function calcs bias according to the CharString type and the count of the subrs

Parameters: Offset The offset to the relevant subrs index Font the font

Returns: The calculated Bias

CalcHints

protected int CalcHints(int begin, int end, int LBias, int GBias, int[] LSubrsOffsets)
The function reads the subroutine and returns the number of the hint in it. If a call to another subroutine is found the function calls recursively.

Parameters: begin the start point of the subr end the end point of the subr LBias the bias of the Local Subrs GBias the bias of the Global Subrs LSubrsOffsets The Offsets array of the subroutines

Returns: The number of hints in the subroutine read.

CalcSubrOffsetSize

int CalcSubrOffsetSize(int Offset, int Size)
Calculates how many byte it took to write the offset for the subrs in a specific private dict.

Parameters: Offset The Offset for the private dict Size The size of the private dict

Returns: The size of the offset of the subrs in the private dict

CopyHeader

protected void CopyHeader()
Function Copies the header from the original fileto the output list

CountCharset

int CountCharset(int Offset, int NumofGlyphs)
Calculates the length of the charset according to its format

Parameters: Offset The Charset Offset NumofGlyphs Number of glyphs in the font

Returns: the length of the Charset

CountRange

int CountRange(int NumofGlyphs, int Type)
Function calculates the number of ranges in the Charset

Parameters: NumofGlyphs The number of glyphs in the font Type The format of the Charset

Returns: The number of ranges in the Charset data structure

CreateCharset

protected void CreateCharset(OffsetItem charsetRef, int nglyphs)
Function creates new CharSet for non-CID fonts. The CharSet built uses a single range for all glyphs

Parameters: charsetRef OffsetItem for the CharSet nglyphs the number of glyphs in the font

CreateFDArray

protected void CreateFDArray(OffsetItem fdarrayRef, OffsetItem privateRef, int Font)
Function creates new FDArray for non-CID fonts. The FDArray built has only the "Private" operator that points to the font's original private dict

Parameters: fdarrayRef OffsetItem for the FDArray privateRef OffsetItem for the Private Dict Font the font

CreateFDSelect

protected void CreateFDSelect(OffsetItem fdselectRef, int nglyphs)
Function creates new FDSelect for non-CID fonts. The FDSelect built uses a single range for all glyphs

Parameters: fdselectRef OffsetItem for the FDSelect nglyphs the number of glyphs in the font

CreateKeys

protected void CreateKeys(OffsetItem fdarrayRef, OffsetItem fdselectRef, OffsetItem charsetRef, OffsetItem charstringsRef)
Function adds the keys into the TopDict

Parameters: fdarrayRef OffsetItem for the FDArray fdselectRef OffsetItem for the FDSelect charsetRef OffsetItem for the CharSet charstringsRef OffsetItem for the CharString

CreateNewStringIndex

protected void CreateNewStringIndex(int Font)
Function takes the original string item and adds the new strings to accommodate the CID rules

Parameters: Font the font

CreateNonCIDPrivate

void CreateNonCIDPrivate(int Font, OffsetItem Subr)
The function creates a private dict for a font that was not CID All the keys are copied as is except for the subrs key

Parameters: Font the font Subr The OffsetItem for the subrs of the private

CreateNonCIDSubrs

void CreateNonCIDSubrs(int Font, IndexBaseItem PrivateBase, OffsetItem Subrs)
the function marks the beginning of the subrs index and adds the subsetted subrs index to the output list.

Parameters: Font the font PrivateBase IndexBaseItem for the private that's referencing to the subrs Subrs OffsetItem for the subrs

EmptyStack

protected void EmptyStack()
Empty the Type2 Stack

HandelStack

protected void HandelStack()
Function Checks how the current operator effects the run time stack after being run An operator may increase or decrease the stack size

PopStack

protected void PopStack()
Pop one element from the stack

Process

public byte[] Process(String fontName)
The Process function extracts one font out of the CFF file and returns a subset version of the original.

Parameters: fontName - The name of the font to be taken out of the CFF

Returns: The new font stream

Throws: IOException

PushStack

protected void PushStack()
Add an item to the stack

readFDSelect

protected void readFDSelect(int Font)
Read the FDSelect of the font and compute the array and its length

Parameters: Font The index of the font being processed

ReadASubr

protected void ReadASubr(int begin, int end, int GBias, int LBias, HashMap hSubr, ArrayList lSubr, int[] LSubrsOffsets)
The function reads a subrs (glyph info) between begin and end. Adds calls to a Lsubr to the hSubr and lSubrs. Adds calls to a Gsubr to the hGSubr and lGSubrs.

Parameters: begin the start point of the subr end the end point of the subr GBias the bias of the Global Subrs LBias the bias of the Local Subrs hSubr the HashMap for the lSubrs lSubr the ArrayList for the lSubrs

ReadCommand

protected void ReadCommand()
The function reads the next command after the file pointer is set

ReadFDArray

protected void ReadFDArray(int Font)
Read the FDArray count, offsize and Offset array

Parameters: Font

Reconstruct

void Reconstruct(int Font)
Function reconstructs the FDArray, PrivateDict and LSubr for CID fonts

Parameters: Font the font

ReconstructFDArray

void ReconstructFDArray(int Font, OffsetItem[] fdPrivate)
Function subsets the FDArray and builds the new one with new offsets

Parameters: Font The font fdPrivate OffsetItem Array (one for each FDArray)

ReconstructPrivateDict

void ReconstructPrivateDict(int Font, OffsetItem[] fdPrivate, IndexBaseItem[] fdPrivateBase, OffsetItem[] fdSubrs)
Function Adds the new private dicts (only for the FDs used) to the list

Parameters: Font the font fdPrivate OffsetItem array one element for each private fdPrivateBase IndexBaseItem array one element for each private fdSubrs OffsetItem array one element for each private

ReconstructPrivateSubrs

void ReconstructPrivateSubrs(int Font, IndexBaseItem[] fdPrivateBase, OffsetItem[] fdSubrs)
Function Adds the new LSubrs dicts (only for the FDs used) to the list

Parameters: Font The index of the font fdPrivateBase The IndexBaseItem array for the linked list fdSubrs OffsetItem array for the linked list

StackOpp

protected int StackOpp()
Function checks the key and return the change to the stack after the operator

Returns: The change in the stack. 2-> flush the stack