From 13d6dc3a6a5e8bd3c17997351a0e6f087eb301a2 Mon Sep 17 00:00:00 2001 From: tknall Date: Tue, 25 Nov 2008 12:04:30 +0000 Subject: Removing itext from source. git-svn-id: https://joinup.ec.europa.eu/svn/pdf-as/trunk@302 7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c --- src/main/java/com/lowagie/text/pdf/CFFFont.java | 1184 ----------------------- 1 file changed, 1184 deletions(-) delete mode 100644 src/main/java/com/lowagie/text/pdf/CFFFont.java (limited to 'src/main/java/com/lowagie/text/pdf/CFFFont.java') diff --git a/src/main/java/com/lowagie/text/pdf/CFFFont.java b/src/main/java/com/lowagie/text/pdf/CFFFont.java deleted file mode 100644 index 2d15f96..0000000 --- a/src/main/java/com/lowagie/text/pdf/CFFFont.java +++ /dev/null @@ -1,1184 +0,0 @@ -/* - * - * Copyright 2003 Sivan Toledo - * - * The contents of this file are subject to the Mozilla Public License Version 1.1 - * (the "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the License. - * - * Contributor(s): all the names of the contributors are added in the source code - * where applicable. - * - * Alternatively, the contents of this file may be used under the terms of the - * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the - * provisions of LGPL are applicable instead of those above. If you wish to - * allow use of your version of this file only under the terms of the LGPL - * License and not to allow others to use your version of this file under - * the MPL, indicate your decision by deleting the provisions above and - * replace them with the notice and other provisions required by the LGPL. - * If you do not delete the provisions above, a recipient may use your version - * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE. - * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the MPL as stated above or under the terms of the GNU - * Library General Public License as published by the Free Software Foundation; - * either version 2 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more - * details. - * - */ - -/* - * Comments by Sivan Toledo: - * I created this class in order to add to iText the ability to utilize - * OpenType fonts with CFF glyphs (these usually have an .otf extension). - * The CFF font within the CFF table of the OT font might be either a CID - * or a Type1 font. (CFF fonts may also contain multiple fonts; I do not - * know if this is allowed in an OT table). The PDF spec, however, only - * allow a CID font with an Identity-H or Identity-V encoding. Otherwise, - * you are limited to an 8-bit encoding. - * Adobe fonts come in both flavors. That is, the OTFs sometimes have - * a CID CFF inside (for Japanese fonts), and sometimes a Type1 CFF - * (virtually all the others, Latin/Greek/Cyrillic). So to easily use - * all the glyphs in the latter, without creating multiple 8-bit encoding, - * I wrote this class, whose main purpose is to convert a Type1 font inside - * a CFF container (which might include other fonts) into a CID CFF font - * that can be directly embeded in the PDF. - * - * Limitations of the current version: - * 1. It does not extract a single CID font from a CFF that contains that - * particular CID along with other fonts. The Adobe Japanese OTF's that - * I have only have one font in the CFF table, so these can be - * embeded in the PDF as is. - * 2. It does not yet subset fonts. - * 3. It may or may not work on CFF fonts that are not within OTF's. - * I didn't try that. In any case, that would probably only be - * useful for subsetting CID fonts, not for CFF Type1 fonts (I don't - * think there are any available. - * I plan to extend the class to support these three features at some - * future time. - */ - -package com.lowagie.text.pdf; - -/** - * @author stoledo - */ - -import java.util.Iterator; -import java.util.LinkedList; -import com.lowagie.text.ExceptionConverter; - -public class CFFFont { - - static final String operatorNames[] = { - "version", "Notice", "FullName", "FamilyName", - "Weight", "FontBBox", "BlueValues", "OtherBlues", - "FamilyBlues", "FamilyOtherBlues", "StdHW", "StdVW", - "UNKNOWN_12", "UniqueID", "XUID", "charset", - "Encoding", "CharStrings", "Private", "Subrs", - "defaultWidthX", "nominalWidthX", "UNKNOWN_22", "UNKNOWN_23", - "UNKNOWN_24", "UNKNOWN_25", "UNKNOWN_26", "UNKNOWN_27", - "UNKNOWN_28", "UNKNOWN_29", "UNKNOWN_30", "UNKNOWN_31", - "Copyright", "isFixedPitch", "ItalicAngle", "UnderlinePosition", - "UnderlineThickness", "PaintType", "CharstringType", "FontMatrix", - "StrokeWidth", "BlueScale", "BlueShift", "BlueFuzz", - "StemSnapH", "StemSnapV", "ForceBold", "UNKNOWN_12_15", - "UNKNOWN_12_16", "LanguageGroup", "ExpansionFactor", "initialRandomSeed", - "SyntheticBase", "PostScript", "BaseFontName", "BaseFontBlend", - "UNKNOWN_12_24", "UNKNOWN_12_25", "UNKNOWN_12_26", "UNKNOWN_12_27", - "UNKNOWN_12_28", "UNKNOWN_12_29", "ROS", "CIDFontVersion", - "CIDFontRevision", "CIDFontType", "CIDCount", "UIDBase", - "FDArray", "FDSelect", "FontName" - }; - - static final String standardStrings[] = { - // Automatically generated from Appendix A of the CFF specification; do - // not edit. Size should be 391. - ".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", - "percent", "ampersand", "quoteright", "parenleft", "parenright", - "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", - "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", - "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", - "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", - "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", - "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", - "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", - "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", - "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", - "florin", "section", "currency", "quotesingle", "quotedblleft", - "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", - "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", - "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", - "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", - "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", - "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", - "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", - "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", - "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", - "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", - "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", - "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", - "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", - "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", - "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", - "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", - "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", - "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", - "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", - "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", - "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", - "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", - "parenleftsuperior", "parenrightsuperior", "twodotenleader", - "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", - "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", - "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", - "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", - "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", - "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", - "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", - "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", - "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", - "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", - "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", - "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", - "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", - "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", - "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", - "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", - "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", - "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", - "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", - "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", - "threeinferior", "fourinferior", "fiveinferior", "sixinferior", - "seveninferior", "eightinferior", "nineinferior", "centinferior", - "dollarinferior", "periodinferior", "commainferior", "Agravesmall", - "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", - "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", - "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", - "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", - "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", - "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", - "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", - "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", - "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold" - }; - - //private String[] strings; - public String getString(char sid) { - if (sid < standardStrings.length) return standardStrings[sid]; - if (sid >= standardStrings.length+(stringOffsets.length-1)) return null; - int j = sid - standardStrings.length; - //java.lang.System.err.println("going for "+j); - int p = getPosition(); - seek(stringOffsets[j]); - StringBuffer s = new StringBuffer(); - for (int k=stringOffsets[j]; k count in the index header. 1->offset size in index header - + 2+1 - //offset array size * offset size - + (count+1)*indexOffSize - //???zero <-> one base - - 1 - // read object offset relative to object array base - + getOffset(indexOffSize); - } - //nextIndexOffset = offsets[count]; - return offsets; - } - - protected String key; - protected Object[] args = new Object[48]; - protected int arg_count = 0; - - protected void getDictItem() { - for (int i=0; i= 32 && b0 <= 246) { - byte item = (byte) (b0-139); - args[arg_count] = new Integer(item); - arg_count++; - //System.err.println(item+" "); - continue; - } - if (b0 >= 247 && b0 <= 250) { - char b1 = getCard8(); - short item = (short) ((b0-247)*256+b1+108); - args[arg_count] = new Integer(item); - arg_count++; - //System.err.println(item+" "); - continue; - } - if (b0 >= 251 && b0 <= 254) { - char b1 = getCard8(); - short item = (short) (-(b0-251)*256-b1-108); - args[arg_count] = new Integer(item); - arg_count++; - //System.err.println(item+" "); - continue; - } - if (b0 == 30) { - String item = ""; - boolean done = false; - char buffer = 0; - byte avail = 0; - int nibble = 0; - while (!done) { - // get a nibble - if (avail==0) { buffer = getCard8(); avail=2; } - if (avail==1) { nibble = (buffer / 16); avail--; } - if (avail==2) { nibble = (buffer % 16); avail--; } - switch (nibble) { - case 0xa: item += "." ; break; - case 0xb: item += "E" ; break; - case 0xc: item += "E-"; break; - case 0xe: item += "-" ; break; - case 0xf: done=true ; break; - default: - if (nibble >= 0 && nibble <= 9) - item += String.valueOf(nibble); - else { - item += ""; - done = true; - } - break; - } - } - args[arg_count] = item; - arg_count++; - //System.err.println(" real=["+item+"]"); - continue; - } - if (b0 <= 21) { - gotKey=true; - if (b0 != 12) key = operatorNames[b0]; - else key = operatorNames[32 + getCard8()]; - //for (int i=0; i>> 24) & 0xff); - i++; - case 3: - buffer[myOffset+i] = (byte) ((value >>> 16) & 0xff); - i++; - case 2: - buffer[myOffset+i] = (byte) ((value >>> 8) & 0xff); - i++; - case 1: - buffer[myOffset+i] = (byte) ((value >>> 0) & 0xff); - i++; - } - /* - int mask = 0xff; - for (int i=size-1; i>=0; i--) { - buffer[myOffset+i] = (byte) (value & mask); - mask <<= 8; - } - */ - } - } - - static protected final class IndexBaseItem extends Item { - public IndexBaseItem() {} - } - - static protected final class IndexMarkerItem extends Item { - private OffsetItem offItem; - private IndexBaseItem indexBase; - public IndexMarkerItem(OffsetItem offItem, IndexBaseItem indexBase) { - this.offItem = offItem; - this.indexBase = indexBase; - } - public void xref() { - //System.err.println("index marker item, base="+indexBase.myOffset+" my="+this.myOffset); - offItem.set(this.myOffset-indexBase.myOffset+1); - } - } - /** - * - * @author orly manor - * - * TODO To change the template for this generated type comment go to - * Window - Preferences - Java - Code Generation - Code and Comments - */ - static protected final class SubrMarkerItem extends Item { - private OffsetItem offItem; - private IndexBaseItem indexBase; - public SubrMarkerItem(OffsetItem offItem, IndexBaseItem indexBase) { - this.offItem = offItem; - this.indexBase = indexBase; - } - public void xref() { - //System.err.println("index marker item, base="+indexBase.myOffset+" my="+this.myOffset); - offItem.set(this.myOffset-indexBase.myOffset); - } - } - - - /** an unknown offset in a dictionary for the list. - * We will fix up the offset later; for now, assume it's large. - */ - static protected final class DictOffsetItem extends OffsetItem { - public final int size; - public DictOffsetItem() {this.size=5; } - - public void increment(int[] currentOffset) { - super.increment(currentOffset); - currentOffset[0] += size; - } - // this is incomplete! - public void emit(byte[] buffer) { - if (size==5) { - buffer[myOffset] = 29; - buffer[myOffset+1] = (byte) ((value >>> 24) & 0xff); - buffer[myOffset+2] = (byte) ((value >>> 16) & 0xff); - buffer[myOffset+3] = (byte) ((value >>> 8) & 0xff); - buffer[myOffset+4] = (byte) ((value >>> 0) & 0xff); - } - } - } - - /** Card24 item. - */ - - static protected final class UInt24Item extends Item { - public int value; - public UInt24Item(int value) {this.value=value;} - - public void increment(int[] currentOffset) { - super.increment(currentOffset); - currentOffset[0] += 3; - } - // this is incomplete! - public void emit(byte[] buffer) { - buffer[myOffset+0] = (byte) ((value >>> 16) & 0xff); - buffer[myOffset+1] = (byte) ((value >>> 8) & 0xff); - buffer[myOffset+2] = (byte) ((value >>> 0) & 0xff); - } - } - - /** Card32 item. - */ - - static protected final class UInt32Item extends Item { - public int value; - public UInt32Item(int value) {this.value=value;} - - public void increment(int[] currentOffset) { - super.increment(currentOffset); - currentOffset[0] += 4; - } - // this is incomplete! - public void emit(byte[] buffer) { - buffer[myOffset+0] = (byte) ((value >>> 24) & 0xff); - buffer[myOffset+1] = (byte) ((value >>> 16) & 0xff); - buffer[myOffset+2] = (byte) ((value >>> 8) & 0xff); - buffer[myOffset+3] = (byte) ((value >>> 0) & 0xff); - } - } - - /** A SID or Card16 item. - */ - - static protected final class UInt16Item extends Item { - public char value; - public UInt16Item(char value) {this.value=value;} - - public void increment(int[] currentOffset) { - super.increment(currentOffset); - currentOffset[0] += 2; - } - // this is incomplete! - public void emit(byte[] buffer) { - buffer[myOffset+0] = (byte) ((value >>> 8) & 0xff); - buffer[myOffset+1] = (byte) ((value >>> 0) & 0xff); - } - } - - /** A Card8 item. - */ - - static protected final class UInt8Item extends Item { - public char value; - public UInt8Item(char value) {this.value=value;} - - public void increment(int[] currentOffset) { - super.increment(currentOffset); - currentOffset[0] += 1; - } - // this is incomplete! - public void emit(byte[] buffer) { - buffer[myOffset+0] = (byte) ((value >>> 0) & 0xff); - } - } - - static protected final class StringItem extends Item { - public String s; - public StringItem(String s) {this.s=s;} - - public void increment(int[] currentOffset) { - super.increment(currentOffset); - currentOffset[0] += s.length(); - } - public void emit(byte[] buffer) { - for (int i=0; i>> 24) & 0xff); - buffer[myOffset+2] = (byte) ((value >>> 16) & 0xff); - buffer[myOffset+3] = (byte) ((value >>> 8) & 0xff); - buffer[myOffset+4] = (byte) ((value >>> 0) & 0xff); - } - } - } - - /** An offset-marker item for the list. - * It is used to mark an offset and to set the offset list item. - */ - - static protected final class MarkerItem extends Item { - OffsetItem p; - public MarkerItem(OffsetItem pointerToMarker) {p=pointerToMarker;} - public void xref() { - p.set(this.myOffset); - } - } - - /** a utility that creates a range item for an entire index - * - * @param indexOffset where the index is - * @return a range item representing the entire index - */ - - protected RangeItem getEntireIndexRange(int indexOffset) { - seek(indexOffset); - int count = getCard16(); - if (count==0) { - return new RangeItem(buf,indexOffset,2); - } else { - int indexOffSize = getCard8(); - seek(indexOffset+2+1+count*indexOffSize); - int size = getOffset(indexOffSize)-1; - return new RangeItem(buf,indexOffset, - 2+1+(count+1)*indexOffSize+size); - } - } - - - /** get a single CID font. The PDF architecture (1.4) - * supports 16-bit strings only with CID CFF fonts, not - * in Type-1 CFF fonts, so we convert the font to CID if - * it is in the Type-1 format. - * Two other tasks that we need to do are to select - * only a single font from the CFF package (this again is - * a PDF restriction) and to subset the CharStrings glyph - * description. - */ - - - public byte[] getCID(String fontName) - //throws java.io.FileNotFoundException - { - int j; - for (j=0; j 127) - fdFontName = fdFontName.substring(0,127); - String extraStrings = "Adobe"+"Identity"+fdFontName; - - int origStringsLen = stringOffsets[stringOffsets.length-1] - - stringOffsets[0]; - int stringsBaseOffset = stringOffsets[0]-1; - - byte stringsIndexOffSize; - if (origStringsLen+extraStrings.length() <= 0xff) stringsIndexOffSize = 1; - else if (origStringsLen+extraStrings.length() <= 0xffff) stringsIndexOffSize = 2; - else if (origStringsLen+extraStrings.length() <= 0xffffff) stringsIndexOffSize = 3; - else stringsIndexOffSize = 4; - - l.addLast(new UInt16Item((char)((stringOffsets.length-1)+3))); // count - l.addLast(new UInt8Item((char)stringsIndexOffSize)); // offSize - for (int i=0; i= 0) { - //System.err.println("has subrs="+fonts[j].privateSubrs+" ,len="+fonts[j].privateLength); - l.addLast(getEntireIndexRange(fonts[j].privateSubrs)); - } - } - - // copy the charstring index - - l.addLast(new MarkerItem(charstringsRef)); - l.addLast(getEntireIndexRange(fonts[j].charstringsOffset)); - - // now create the new CFF font - - int[] currentOffset = new int[1]; - currentOffset[0] = 0; - - Iterator listIter = l.iterator(); - while ( listIter.hasNext() ) { - Item item = (Item) listIter.next(); - item.increment(currentOffset); - } - - listIter = l.iterator(); - while ( listIter.hasNext() ) { - Item item = (Item) listIter.next(); - item.xref(); - } - - int size = currentOffset[0]; - byte[] b = new byte[size]; - - listIter = l.iterator(); - while ( listIter.hasNext() ) { - Item item = (Item) listIter.next(); - item.emit(b); - } - - return b; - } - - - public boolean isCID(String fontName) { - int j; - for (j=0; j"); - } - - // string index - - //strings = new String[stringOffsets.length-1]; - /* - System.err.println("std strings = "+standardStrings.length); - System.err.println("fnt strings = "+(stringOffsets.length-1)); - for (char j=0; j"); - } - */ - - // top dict - - for (int j=0; j= 0) { - //System.err.println("PRIVATE::"); - seek(fonts[j].privateOffset); - while (getPosition() < fonts[j].privateOffset+fonts[j].privateLength) { - getDictItem(); - if (key=="Subrs") - //Add the private offset to the lsubrs since the offset is - // relative to the begining of the PrivateDict - fonts[j].privateSubrs = ((Integer)args[0]).intValue()+fonts[j].privateOffset; - } - } - - // fdarray index - if (fonts[j].fdarrayOffset >= 0) { - int[] fdarrayOffsets = getIndex(fonts[j].fdarrayOffset); - - fonts[j].fdprivateOffsets = new int[fdarrayOffsets.length-1]; - fonts[j].fdprivateLengths = new int[fdarrayOffsets.length-1]; - - //System.err.println("FD Font::"); - - for (int k=0; k