001: /*
002: * Copyright 2003 by Paulo Soares.
003: *
004: * The contents of this file are subject to the Mozilla Public License Version 1.1
005: * (the "License"); you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at http://www.mozilla.org/MPL/
007: *
008: * Software distributed under the License is distributed on an "AS IS" basis,
009: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
010: * for the specific language governing rights and limitations under the License.
011: *
012: * The Original Code is 'iText, a free JAVA-PDF library'.
013: *
014: * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
015: * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
016: * All Rights Reserved.
017: * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
018: * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
019: *
020: * Contributor(s): all the names of the contributors are added in the source code
021: * where applicable.
022: *
023: * Alternatively, the contents of this file may be used under the terms of the
024: * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
025: * provisions of LGPL are applicable instead of those above. If you wish to
026: * allow use of your version of this file only under the terms of the LGPL
027: * License and not to allow others to use your version of this file under
028: * the MPL, indicate your decision by deleting the provisions above and
029: * replace them with the notice and other provisions required by the LGPL.
030: * If you do not delete the provisions above, a recipient may use your version
031: * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
032: *
033: * This library is free software; you can redistribute it and/or modify it
034: * under the terms of the MPL as stated above or under the terms of the GNU
035: * Library General Public License as published by the Free Software Foundation;
036: * either version 2 of the License, or any later version.
037: *
038: * This library is distributed in the hope that it will be useful, but WITHOUT
039: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
040: * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
041: * details.
042: *
043: * If you didn't download this code from the following link, you should check if
044: * you aren't using an obsolete version:
045: * http://www.lowagie.com/iText/
046: */
047: package com.lowagie.text.pdf;
048:
049: import java.util.ArrayList;
050:
051: import com.lowagie.text.Chunk;
052: import com.lowagie.text.Font;
053: import com.lowagie.text.Phrase;
054:
055: /** Selects the appropriate fonts that contain the glyphs needed to
056: * render text correctly. The fonts are checked in order until the
057: * character is found.
058: * <p>
059: * The built in fonts "Symbol" and "ZapfDingbats", if used, have a special encoding
060: * to allow the characters to be referred by Unicode.
061: * @author Paulo Soares (psoares@consiste.pt)
062: */
063: public class FontSelector {
064:
065: protected ArrayList fonts = new ArrayList();
066:
067: /**
068: * Adds a <CODE>Font</CODE> to be searched for valid characters.
069: * @param font the <CODE>Font</CODE>
070: */
071: public void addFont(Font font) {
072: if (font.getBaseFont() != null) {
073: fonts.add(font);
074: return;
075: }
076: BaseFont bf = font.getCalculatedBaseFont(true);
077: Font f2 = new Font(bf, font.getSize(), font
078: .getCalculatedStyle(), font.getColor());
079: fonts.add(f2);
080: }
081:
082: /**
083: * Process the text so that it will render with a combination of fonts
084: * if needed.
085: * @param text the text
086: * @return a <CODE>Phrase</CODE> with one or more chunks
087: */
088: public Phrase process(String text) {
089: int fsize = fonts.size();
090: if (fsize == 0)
091: throw new IndexOutOfBoundsException("No font is defined.");
092: char cc[] = text.toCharArray();
093: int len = cc.length;
094: StringBuffer sb = new StringBuffer();
095: Font font = null;
096: int lastidx = -1;
097: Phrase ret = new Phrase();
098: for (int k = 0; k < len; ++k) {
099: char c = cc[k];
100: if (c == '\n' || c == '\r') {
101: sb.append(c);
102: continue;
103: }
104: for (int f = 0; f < fsize; ++f) {
105: font = (Font) fonts.get(f);
106: if (font.getBaseFont().charExists(c)) {
107: if (lastidx == f)
108: sb.append(c);
109: else {
110: if (sb.length() > 0 && lastidx != -1) {
111: Chunk ck = new Chunk(sb.toString(),
112: (Font) fonts.get(lastidx));
113: ret.add(ck);
114: sb.setLength(0);
115: }
116: sb.append(c);
117: lastidx = f;
118: }
119: break;
120: }
121: }
122: }
123: if (sb.length() > 0) {
124: Chunk ck = new Chunk(sb.toString(), (Font) fonts
125: .get(lastidx == -1 ? 0 : lastidx));
126: ret.add(ck);
127: }
128: return ret;
129: }
130: }
|