Package com.itextpdf.text.pdf
Class CFFFontSubset
- java.lang.Object
-
- com.itextpdf.text.pdf.CFFFont
-
- com.itextpdf.text.pdf.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)
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class com.itextpdf.text.pdf.CFFFont
CFFFont.DictNumberItem, CFFFont.DictOffsetItem, CFFFont.Font, CFFFont.IndexBaseItem, CFFFont.IndexMarkerItem, CFFFont.IndexOffsetItem, CFFFont.Item, CFFFont.MarkerItem, CFFFont.OffsetItem, CFFFont.RangeItem, CFFFont.StringItem, CFFFont.SubrMarkerItem, CFFFont.UInt16Item, CFFFont.UInt24Item, CFFFont.UInt32Item, CFFFont.UInt8Item
-
-
Field Summary
Fields Modifier and Type Field Description (package private) static byte
ENDCHAR_OP
Operator codes for unused CharStrings and unused local and global Subrs(package private) java.util.HashSet<java.lang.Integer>
FDArrayUsed
A HashSet for keeping the FDArrays being used by the font(package private) int
GBias
The bias for the global subroutines(package private) java.util.ArrayList<java.lang.Integer>
glyphsInList
The GlyphsUsed keys as an ArrayList(package private) java.util.HashMap<java.lang.Integer,int[]>
GlyphsUsed
A HashMap containing the glyphs used in the text after being converted to glyph number by the CMap(package private) java.util.HashMap<java.lang.Integer,int[]>
hGSubrsUsed
A HashMap for keeping the Global subroutines used in the font(package private) java.util.HashMap<java.lang.Integer,int[]>[]
hSubrsUsed
A HashMaps array for keeping the subroutines used in each FontDict(package private) java.util.HashMap<java.lang.Integer,int[]>
hSubrsUsedNonCID
A HashMap for keeping the subroutines used in a non-cid font(package private) java.util.ArrayList<java.lang.Integer>
lGSubrsUsed
The Global SubroutinesUsed HashMaps as ArrayLists(package private) java.util.ArrayList<java.lang.Integer>[]
lSubrsUsed
The SubroutinesUsed HashMaps as ArrayLists(package private) java.util.ArrayList<java.lang.Integer>
lSubrsUsedNonCID
The SubroutinesUsed HashMap as ArrayList(package private) byte[]
NewCharStringsIndex
The new CharString of the font(package private) byte[]
NewGSubrsIndex
The new global subroutines index of the font(package private) byte[][]
NewLSubrsIndex
An array of the new Indexes for the local Subr.(package private) byte[]
NewSubrsIndexNonCID
The new subroutines index for a non-cid font(package private) int
NumOfHints
Number of arguments to the stem operators in a subroutine calculated recursively(package private) java.util.LinkedList<CFFFont.Item>
OutputList
The linked list for generating the new font stream(package private) static byte
RETURN_OP
(package private) static java.lang.String[]
SubrsEscapeFuncs
The Strings in this array represent Type1/Type2 escape operator names(package private) static java.lang.String[]
SubrsFunctions
The Strings in this array represent Type1/Type2 operator names-
Fields inherited from class com.itextpdf.text.pdf.CFFFont
arg_count, args, buf, fonts, gsubrIndexOffset, gsubrOffsets, key, nameIndexOffset, nameOffsets, nextIndexOffset, operatorNames, standardStrings, stringIndexOffset, stringOffsets, topdictIndexOffset, topdictOffsets
-
-
Constructor Summary
Constructors Constructor Description CFFFontSubset(RandomAccessFileOrArray rf, java.util.HashMap<java.lang.Integer,int[]> GlyphsUsed)
C'tor for CFFFontSubset
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected byte[]
AssembleIndex(int[] NewOffsets, byte[] NewObjects)
Function creates the new index, inserting the count,offsetsize,offset array and object array.protected void
BuildFDArrayUsed(int Font)
Function reads the FDSelect and builds the FDArrayUsed HashMap According to the glyphs usedprotected void
BuildFDSubrsOffsets(int Font, int FD)
The function finds for the FD array processed the local subr offset and its offset array.protected void
BuildGSubrsUsed(int Font)
Function scans the Glsubr used ArrayList to find recursive calls to Gsubrs and adds to Hashmap & ArrayListprotected void
BuildIndexHeader(int Count, int Offsize, int First)
Function Build the header of an indexprotected void
BuildNewCharString(int FontIndex)
Function uses BuildNewIndex to create the new index of the subset charstringsprotected byte[]
BuildNewFile(int Font)
The function builds the new output stream according to the subset processprotected byte[]
BuildNewIndex(int[] Offsets, java.util.HashMap<java.lang.Integer,int[]> Used, byte OperatorForUnusedEntries)
Function builds the new offset array, object array and assembles the index.protected byte[]
BuildNewIndexAndCopyAllGSubrs(int[] Offsets, byte OperatorForUnusedEntries)
Function builds the new offset array, object array and assembles the index.protected void
BuildNewLGSubrs(int Font)
Function builds the new local & global subsrs indices.protected void
BuildSubrUsed(int Font, int FD, int SubrOffset, int[] SubrsOffsets, java.util.HashMap<java.lang.Integer,int[]> hSubr, java.util.ArrayList<java.lang.Integer> lSubr)
Function uses ReadAsubr on the glyph used to build the LSubr & Gsubr HashMap.protected int
CalcBias(int Offset, int Font)
Function calcs bias according to the CharString type and the count of the subrsprotected 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.(package private) int
CalcSubrOffsetSize(int Offset, int Size)
Calculates how many byte it took to write the offset for the subrs in a specific private dict.protected void
CopyHeader()
Function Copies the header from the original fileto the output list(package private) int
CountCharset(int Offset, int NumofGlyphs)
Calculates the length of the charset according to its formatprotected int
countEntireIndexRange(int indexOffset)
Function computes the size of an index(package private) int
CountRange(int NumofGlyphs, int Type)
Function calculates the number of ranges in the Charsetprotected void
CreateCharset(CFFFont.OffsetItem charsetRef, int nglyphs)
Function creates new CharSet for non-CID fonts.protected void
CreateFDArray(CFFFont.OffsetItem fdarrayRef, CFFFont.OffsetItem privateRef, int Font)
Function creates new FDArray for non-CID fonts.protected void
CreateFDSelect(CFFFont.OffsetItem fdselectRef, int nglyphs)
Function creates new FDSelect for non-CID fonts.protected void
CreateKeys(CFFFont.OffsetItem fdarrayRef, CFFFont.OffsetItem fdselectRef, CFFFont.OffsetItem charsetRef, CFFFont.OffsetItem charstringsRef)
Function adds the keys into the TopDictprotected void
CreateNewStringIndex(int Font)
Function takes the original string item and adds the new strings to accommodate the CID rules(package private) void
CreateNonCIDPrivate(int Font, CFFFont.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(package private) void
CreateNonCIDSubrs(int Font, CFFFont.IndexBaseItem PrivateBase, CFFFont.OffsetItem Subrs)
the function marks the beginning of the subrs index and adds the subsetted subrs index to the output list.protected void
EmptyStack()
Empty the Type2 Stackprotected void
HandelStack()
Function Checks how the current operator effects the run time stack after being run An operator may increase or decrease the stack sizeprotected void
PopStack()
Pop one element from the stackbyte[]
Process(java.lang.String fontName)
The Process function extracts one font out of the CFF file and returns a subset version of the original.protected void
PushStack()
Add an item to the stackprotected void
ReadASubr(int begin, int end, int GBias, int LBias, java.util.HashMap<java.lang.Integer,int[]> hSubr, java.util.ArrayList<java.lang.Integer> lSubr, int[] LSubrsOffsets)
The function reads a subrs (glyph info) between begin and end.protected void
ReadCommand()
The function reads the next command after the file pointer is setprotected void
ReadFDArray(int Font)
Read the FDArray count, offsize and Offset arrayprotected void
readFDSelect(int Font)
Read the FDSelect of the font and compute the array and its length(package private) void
Reconstruct(int Font)
Function reconstructs the FDArray, PrivateDict and LSubr for CID fonts(package private) void
ReconstructFDArray(int Font, CFFFont.OffsetItem[] fdPrivate)
Function subsets the FDArray and builds the new one with new offsets(package private) void
ReconstructPrivateDict(int Font, CFFFont.OffsetItem[] fdPrivate, CFFFont.IndexBaseItem[] fdPrivateBase, CFFFont.OffsetItem[] fdSubrs)
Function Adds the new private dicts (only for the FDs used) to the list(package private) void
ReconstructPrivateSubrs(int Font, CFFFont.IndexBaseItem[] fdPrivateBase, CFFFont.OffsetItem[] fdSubrs)
Function Adds the new LSubrs dicts (only for the FDs used) to the listprotected int
StackOpp()
Function checks the key and return the change to the stack after the operator-
Methods inherited from class com.itextpdf.text.pdf.CFFFont
exists, getCard16, getCard8, getCID, getDictItem, getEntireIndexRange, getIndex, getInt, getNames, getOffset, getPosition, getShort, getString, isCID, ReadEncoding, seek
-
-
-
-
Field Detail
-
SubrsFunctions
static final java.lang.String[] SubrsFunctions
The Strings in this array represent Type1/Type2 operator names
-
SubrsEscapeFuncs
static final java.lang.String[] SubrsEscapeFuncs
The Strings in this array represent Type1/Type2 escape operator names
-
ENDCHAR_OP
static final byte ENDCHAR_OP
Operator codes for unused CharStrings and unused local and global Subrs- See Also:
- Constant Field Values
-
RETURN_OP
static final byte RETURN_OP
- See Also:
- Constant Field Values
-
GlyphsUsed
java.util.HashMap<java.lang.Integer,int[]> GlyphsUsed
A HashMap containing the glyphs used in the text after being converted to glyph number by the CMap
-
glyphsInList
java.util.ArrayList<java.lang.Integer> glyphsInList
The GlyphsUsed keys as an ArrayList
-
FDArrayUsed
java.util.HashSet<java.lang.Integer> FDArrayUsed
A HashSet for keeping the FDArrays being used by the font
-
hSubrsUsed
java.util.HashMap<java.lang.Integer,int[]>[] hSubrsUsed
A HashMaps array for keeping the subroutines used in each FontDict
-
lSubrsUsed
java.util.ArrayList<java.lang.Integer>[] lSubrsUsed
The SubroutinesUsed HashMaps as ArrayLists
-
hGSubrsUsed
java.util.HashMap<java.lang.Integer,int[]> hGSubrsUsed
A HashMap for keeping the Global subroutines used in the font
-
lGSubrsUsed
java.util.ArrayList<java.lang.Integer> lGSubrsUsed
The Global SubroutinesUsed HashMaps as ArrayLists
-
hSubrsUsedNonCID
java.util.HashMap<java.lang.Integer,int[]> hSubrsUsedNonCID
A HashMap for keeping the subroutines used in a non-cid font
-
lSubrsUsedNonCID
java.util.ArrayList<java.lang.Integer> lSubrsUsedNonCID
The SubroutinesUsed HashMap as ArrayList
-
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
-
NewGSubrsIndex
byte[] NewGSubrsIndex
The new global subroutines index of the font
-
NewCharStringsIndex
byte[] NewCharStringsIndex
The new CharString of the font
-
GBias
int GBias
The bias for the global subroutines
-
OutputList
java.util.LinkedList<CFFFont.Item> OutputList
The linked list for generating the new font stream
-
NumOfHints
int NumOfHints
Number of arguments to the stem operators in a subroutine calculated recursively
-
-
Constructor Detail
-
CFFFontSubset
public CFFFontSubset(RandomAccessFileOrArray rf, java.util.HashMap<java.lang.Integer,int[]> GlyphsUsed)
C'tor for CFFFontSubset- Parameters:
rf
- - The font fileGlyphsUsed
- - a HashMap that contains the glyph used in the subset
-
-
Method Detail
-
CountCharset
int CountCharset(int Offset, int NumofGlyphs)
Calculates the length of the charset according to its format- Parameters:
Offset
- The Charset OffsetNumofGlyphs
- 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 fontType
- The format of the Charset- Returns:
- The number of ranges in the Charset data structure
-
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
-
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
-
ReadFDArray
protected void ReadFDArray(int Font)
Read the FDArray count, offsize and Offset array- Parameters:
Font
-
-
Process
public byte[] Process(java.lang.String fontName) throws java.io.IOException
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:
java.io.IOException
-
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 indexFont
- the font- Returns:
- The calculated Bias
-
BuildNewCharString
protected void BuildNewCharString(int FontIndex) throws java.io.IOException
Function uses BuildNewIndex to create the new index of the subset charstrings- Parameters:
FontIndex
- the font- Throws:
java.io.IOException
-
BuildNewLGSubrs
protected void BuildNewLGSubrs(int Font) throws java.io.IOException
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:
java.io.IOException
-
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 fontFD
- The FDARRAY processed
-
BuildSubrUsed
protected void BuildSubrUsed(int Font, int FD, int SubrOffset, int[] SubrsOffsets, java.util.HashMap<java.lang.Integer,int[]> hSubr, java.util.ArrayList<java.lang.Integer> 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 fontFD
- FD array processed. 0 indicates function was called by non CID fontSubrOffset
- the offset to the subr index to calc the biasSubrsOffsets
- the offset array of the subr indexhSubr
- HashMap of the subrs usedlSubr
- ArrayList of the subrs used
-
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
-
ReadASubr
protected void ReadASubr(int begin, int end, int GBias, int LBias, java.util.HashMap<java.lang.Integer,int[]> hSubr, java.util.ArrayList<java.lang.Integer> 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 subrend
- the end point of the subrGBias
- the bias of the Global SubrsLBias
- the bias of the Local SubrshSubr
- the HashMap for the lSubrslSubr
- the ArrayList for the lSubrs
-
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
-
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
-
EmptyStack
protected void EmptyStack()
Empty the Type2 Stack
-
PopStack
protected void PopStack()
Pop one element from the stack
-
PushStack
protected void PushStack()
Add an item to the stack
-
ReadCommand
protected void ReadCommand()
The function reads the next command after the file pointer is set
-
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 subrend
- the end point of the subrLBias
- the bias of the Local SubrsGBias
- the bias of the Global SubrsLSubrsOffsets
- The Offsets array of the subroutines- Returns:
- The number of hints in the subroutine read.
-
BuildNewIndex
protected byte[] BuildNewIndex(int[] Offsets, java.util.HashMap<java.lang.Integer,int[]> Used, byte OperatorForUnusedEntries) throws java.io.IOException
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 indexUsed
- the hashmap of the used objectsOperatorForUnusedEntries
- the operator inserted into the data stream for unused entries- Returns:
- the new index subset version
- Throws:
java.io.IOException
-
BuildNewIndexAndCopyAllGSubrs
protected byte[] BuildNewIndexAndCopyAllGSubrs(int[] Offsets, byte OperatorForUnusedEntries) throws java.io.IOException
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 indexOperatorForUnusedEntries
- the operator inserted into the data stream for unused entries- Returns:
- the new index subset version
- Throws:
java.io.IOException
-
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 arrayNewObjects
- the subsetted object array- Returns:
- the new index created
-
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
-
CopyHeader
protected void CopyHeader()
Function Copies the header from the original fileto the output list
-
BuildIndexHeader
protected void BuildIndexHeader(int Count, int Offsize, int First)
Function Build the header of an index- Parameters:
Count
- the count field of the indexOffsize
- the offsize field of the indexFirst
- the first offset of the index
-
CreateKeys
protected void CreateKeys(CFFFont.OffsetItem fdarrayRef, CFFFont.OffsetItem fdselectRef, CFFFont.OffsetItem charsetRef, CFFFont.OffsetItem charstringsRef)
Function adds the keys into the TopDict- Parameters:
fdarrayRef
- OffsetItem for the FDArrayfdselectRef
- OffsetItem for the FDSelectcharsetRef
- OffsetItem for the CharSetcharstringsRef
- 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
-
CreateFDSelect
protected void CreateFDSelect(CFFFont.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 FDSelectnglyphs
- the number of glyphs in the font
-
CreateCharset
protected void CreateCharset(CFFFont.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 CharSetnglyphs
- the number of glyphs in the font
-
CreateFDArray
protected void CreateFDArray(CFFFont.OffsetItem fdarrayRef, CFFFont.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 FDArrayprivateRef
- OffsetItem for the Private DictFont
- the 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, CFFFont.OffsetItem[] fdPrivate)
Function subsets the FDArray and builds the new one with new offsets- Parameters:
Font
- The fontfdPrivate
- OffsetItem Array (one for each FDArray)
-
ReconstructPrivateDict
void ReconstructPrivateDict(int Font, CFFFont.OffsetItem[] fdPrivate, CFFFont.IndexBaseItem[] fdPrivateBase, CFFFont.OffsetItem[] fdSubrs)
Function Adds the new private dicts (only for the FDs used) to the list- Parameters:
Font
- the fontfdPrivate
- OffsetItem array one element for each privatefdPrivateBase
- IndexBaseItem array one element for each privatefdSubrs
- OffsetItem array one element for each private
-
ReconstructPrivateSubrs
void ReconstructPrivateSubrs(int Font, CFFFont.IndexBaseItem[] fdPrivateBase, CFFFont.OffsetItem[] fdSubrs)
Function Adds the new LSubrs dicts (only for the FDs used) to the list- Parameters:
Font
- The index of the fontfdPrivateBase
- The IndexBaseItem array for the linked listfdSubrs
- OffsetItem array for the linked list
-
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 dictSize
- The size of the private dict- Returns:
- The size of the offset of the subrs in the private dict
-
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
-
CreateNonCIDPrivate
void CreateNonCIDPrivate(int Font, CFFFont.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 fontSubr
- The OffsetItem for the subrs of the private
-
CreateNonCIDSubrs
void CreateNonCIDSubrs(int Font, CFFFont.IndexBaseItem PrivateBase, CFFFont.OffsetItem Subrs)
the function marks the beginning of the subrs index and adds the subsetted subrs index to the output list.- Parameters:
Font
- the fontPrivateBase
- IndexBaseItem for the private that's referencing to the subrsSubrs
- OffsetItem for the subrs
-
-