pdfencodings.java

来自「源码包含生成 PDF 和 HTML 的类库」· Java 代码 · 共 798 行 · 第 1/3 页

JAVA
798
字号
/* * Copyright 2002 Paulo Soares * * 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. * * The Original Code is 'iText, a free JAVA-PDF library'. * * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie. * All Rights Reserved. * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved. * * 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. * * If you didn't download this code from the following link, you should check if * you aren't using an obsolete version: * http://www.lowagie.com/iText/ */package com.lowagie.text.pdf;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.HashMap;import java.util.StringTokenizer;import com.lowagie.text.ExceptionConverter;/** Supports fast encodings for winansi and PDFDocEncoding. * Supports conversions from CJK encodings to CID. * Supports custom encodings. * @author Paulo Soares (psoares@consiste.pt) */public class PdfEncodings {    protected static final int CIDNONE = 0;    protected static final int CIDRANGE = 1;    protected static final int CIDCHAR = 2;    static final char winansiByteToChar[] = {        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,         16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,         32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,         48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,         64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,         80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,         96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,         112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,         8364, 65533, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 352, 8249, 338, 65533, 381, 65533,         65533, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 65533, 382, 376,         160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,         176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,         192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,         208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,         224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,         240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255};            static final char pdfEncodingByteToChar[] = {        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,         16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,         32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,         48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,         64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,         80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,         96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,         112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,         0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018,        0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 65533,        0x20ac, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,         176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,         192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,         208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,         224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,         240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255};            static final IntHashtable winansi = new IntHashtable();        static final IntHashtable pdfEncoding = new IntHashtable();        static HashMap extraEncodings = new HashMap();        static {                for (int k = 128; k < 161; ++k) {            char c = winansiByteToChar[k];            if (c != 65533)                winansi.put(c, k);        }        for (int k = 128; k < 161; ++k) {            char c = pdfEncodingByteToChar[k];            if (c != 65533)                pdfEncoding.put(c, k);        }                addExtraEncoding("Wingdings", new WingdingsConversion());        addExtraEncoding("Symbol", new SymbolConversion(true));        addExtraEncoding("ZapfDingbats", new SymbolConversion(false));        addExtraEncoding("SymbolTT", new SymbolTTConversion());        addExtraEncoding("Cp437", new Cp437Conversion());    }    /** Converts a <CODE>String</CODE> to a </CODE>byte</CODE> array according     * to the font's encoding.     * @return an array of <CODE>byte</CODE> representing the conversion according to the font's encoding     * @param encoding the encoding     * @param text the <CODE>String</CODE> to be converted     */    public static final byte[] convertToBytes(String text, String encoding) {        if (text == null)            return new byte[0];        if (encoding == null || encoding.length() == 0) {            int len = text.length();            byte b[] = new byte[len];            for (int k = 0; k < len; ++k)                b[k] = (byte)text.charAt(k);            return b;        }        ExtraEncoding extra = (ExtraEncoding)extraEncodings.get(encoding.toLowerCase());        if (extra != null) {            byte b[] = extra.charToByte(text, encoding);            if (b != null)                return b;        }        IntHashtable hash = null;        if (encoding.equals(BaseFont.WINANSI))            hash = winansi;        else if (encoding.equals(PdfObject.TEXT_PDFDOCENCODING))            hash = pdfEncoding;        if (hash != null) {            char cc[] = text.toCharArray();            int len = cc.length;            int ptr = 0;            byte b[] = new byte[len];            int c = 0;            for (int k = 0; k < len; ++k) {                char char1 = cc[k];                if (char1 < 128 || (char1 > 160 && char1 <= 255))                    c = char1;                else                    c = hash.get(char1);                if (c != 0)                    b[ptr++] = (byte)c;            }            if (ptr == len)                return b;            byte b2[] = new byte[ptr];            System.arraycopy(b, 0, b2, 0, ptr);            return b2;        }        if (encoding.equals(PdfObject.TEXT_UNICODE)) {            // workaround for jdk 1.2.2 bug            char cc[] = text.toCharArray();            int len = cc.length;            byte b[] = new byte[cc.length * 2 + 2];            b[0] = -2;            b[1] = -1;            int bptr = 2;            for (int k = 0; k < len; ++k) {                char c = cc[k];                b[bptr++] = (byte)(c >> 8);                b[bptr++] = (byte)(c & 0xff);            }            return b;        }        try {            return text.getBytes(encoding);        }        catch (UnsupportedEncodingException e) {            throw new ExceptionConverter(e);        }    }        /** Converts a <CODE>String</CODE> to a </CODE>byte</CODE> array according     * to the font's encoding.     * @return an array of <CODE>byte</CODE> representing the conversion according to the font's encoding     * @param encoding the encoding     * @param char1 the <CODE>char</CODE> to be converted     */    public static final byte[] convertToBytes(char char1, String encoding) {        if (encoding == null || encoding.length() == 0)            return new byte[]{(byte)char1};        ExtraEncoding extra = (ExtraEncoding)extraEncodings.get(encoding.toLowerCase());        if (extra != null) {            byte b[] = extra.charToByte(char1, encoding);            if (b != null)                return b;        }        IntHashtable hash = null;        if (encoding.equals(BaseFont.WINANSI))            hash = winansi;        else if (encoding.equals(PdfObject.TEXT_PDFDOCENCODING))            hash = pdfEncoding;        if (hash != null) {            int c = 0;            if (char1 < 128 || (char1 > 160 && char1 <= 255))                c = char1;            else                c = hash.get(char1);            if (c != 0)                return new byte[]{(byte)c};            else                return new byte[0];        }        if (encoding.equals(PdfObject.TEXT_UNICODE)) {            // workaround for jdk 1.2.2 bug            byte b[] = new byte[4];            b[0] = -2;            b[1] = -1;            b[2] = (byte)(char1 >> 8);            b[3] = (byte)(char1 & 0xff);            return b;        }        try {            return String.valueOf(char1).getBytes(encoding);        }        catch (UnsupportedEncodingException e) {            throw new ExceptionConverter(e);        }    }        /** Converts a </CODE>byte</CODE> array to a <CODE>String</CODE> according     * to the some encoding.     * @param bytes the bytes to convert     * @param encoding the encoding     * @return the converted <CODE>String</CODE>     */        public static final String convertToString(byte bytes[], String encoding) {        if (bytes == null)            return PdfObject.NOTHING;        if (encoding == null || encoding.length() == 0) {            char c[] = new char[bytes.length];            for (int k = 0; k < bytes.length; ++k)                c[k] = (char)(bytes[k] & 0xff);            return new String(c);        }        ExtraEncoding extra = (ExtraEncoding)extraEncodings.get(encoding.toLowerCase());        if (extra != null) {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?