aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/lowagie/text/pdf/PdfChunk.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/lowagie/text/pdf/PdfChunk.java')
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfChunk.java781
1 files changed, 781 insertions, 0 deletions
diff --git a/src/main/java/com/lowagie/text/pdf/PdfChunk.java b/src/main/java/com/lowagie/text/pdf/PdfChunk.java
new file mode 100644
index 0000000..2906552
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfChunk.java
@@ -0,0 +1,781 @@
+/*
+ * $Id: PdfChunk.java,v 1.71 2006/02/16 16:17:52 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * 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.awt.Color;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Font;
+import com.lowagie.text.Image;
+import com.lowagie.text.SplitCharacter;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * A <CODE>PdfChunk</CODE> is the PDF translation of a <CODE>Chunk</CODE>.
+ * <P>
+ * A <CODE>PdfChunk</CODE> is a <CODE>PdfString</CODE> in a certain
+ * <CODE>PdfFont</CODE> and <CODE>Color</CODE>.
+ *
+ * @see PdfString
+ * @see com.lowagie.text.Chunk
+ * @see com.lowagie.text.Font
+ */
+
+public class PdfChunk implements SplitCharacter{
+
+ private static final char singleSpace[] = {' '};
+ private static final PdfChunk thisChunk[] = new PdfChunk[1];
+ private static final float ITALIC_ANGLE = 0.21256f;
+/** The allowed attributes in variable <CODE>attributes</CODE>. */
+ private static final HashMap keysAttributes = new HashMap();
+
+/** The allowed attributes in variable <CODE>noStroke</CODE>. */
+ private static final HashMap keysNoStroke = new HashMap();
+
+ static {
+ keysAttributes.put(Chunk.ACTION, null);
+ keysAttributes.put(Chunk.UNDERLINE, null);
+ keysAttributes.put(Chunk.REMOTEGOTO, null);
+ keysAttributes.put(Chunk.LOCALGOTO, null);
+ keysAttributes.put(Chunk.LOCALDESTINATION, null);
+ keysAttributes.put(Chunk.GENERICTAG, null);
+ keysAttributes.put(Chunk.NEWPAGE, null);
+ keysAttributes.put(Chunk.IMAGE, null);
+ keysAttributes.put(Chunk.BACKGROUND, null);
+ keysAttributes.put(Chunk.PDFANNOTATION, null);
+ keysAttributes.put(Chunk.SKEW, null);
+ keysAttributes.put(Chunk.HSCALE, null);
+ keysNoStroke.put(Chunk.SUBSUPSCRIPT, null);
+ keysNoStroke.put(Chunk.SPLITCHARACTER, null);
+ keysNoStroke.put(Chunk.HYPHENATION, null);
+ keysNoStroke.put(Chunk.TEXTRENDERMODE, null);
+ }
+
+ // membervariables
+
+ /** The value of this object. */
+ protected String value = PdfObject.NOTHING;
+
+ /** The encoding. */
+ protected String encoding = BaseFont.WINANSI;
+
+
+/** The font for this <CODE>PdfChunk</CODE>. */
+ protected PdfFont font;
+
+ protected BaseFont baseFont;
+
+ protected SplitCharacter splitCharacter;
+/**
+ * Metric attributes.
+ * <P>
+ * This attributes require the mesurement of characters widths when rendering
+ * such as underline.
+ */
+ protected HashMap attributes = new HashMap();
+
+/**
+ * Non metric attributes.
+ * <P>
+ * This attributes do not require the mesurement of characters widths when rendering
+ * such as Color.
+ */
+ protected HashMap noStroke = new HashMap();
+
+/** <CODE>true</CODE> if the chunk split was cause by a newline. */
+ protected boolean newlineSplit;
+
+/** The image in this <CODE>PdfChunk</CODE>, if it has one */
+ protected Image image;
+
+/** The offset in the x direction for the image */
+ protected float offsetX;
+
+/** The offset in the y direction for the image */
+ protected float offsetY;
+
+/** Indicates if the height and offset of the Image has to be taken into account */
+ protected boolean changeLeading = false;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfChunk</CODE>-object.
+ *
+ * @param string the content of the <CODE>PdfChunk</CODE>-object
+ * @param other Chunk with the same style you want for the new Chunk
+ */
+
+ PdfChunk(String string, PdfChunk other) {
+ thisChunk[0] = this;
+ value = string;
+ this.font = other.font;
+ this.attributes = other.attributes;
+ this.noStroke = other.noStroke;
+ this.baseFont = other.baseFont;
+ Object obj[] = (Object[])attributes.get(Chunk.IMAGE);
+ if (obj == null)
+ image = null;
+ else {
+ image = (Image)obj[0];
+ offsetX = ((Float)obj[1]).floatValue();
+ offsetY = ((Float)obj[2]).floatValue();
+ changeLeading = ((Boolean)obj[3]).booleanValue();
+ }
+ encoding = font.getFont().getEncoding();
+ splitCharacter = (SplitCharacter)noStroke.get(Chunk.SPLITCHARACTER);
+ if (splitCharacter == null)
+ splitCharacter = this;
+ }
+
+/**
+ * Constructs a <CODE>PdfChunk</CODE>-object.
+ *
+ * @param chunk the original <CODE>Chunk</CODE>-object
+ * @param action the <CODE>PdfAction</CODE> if the <CODE>Chunk</CODE> comes from an <CODE>Anchor</CODE>
+ */
+
+ PdfChunk(Chunk chunk, PdfAction action) {
+ thisChunk[0] = this;
+ value = chunk.content();
+
+ Font f = chunk.font();
+ float size = f.size();
+ if (size == Font.UNDEFINED)
+ size = 12;
+ baseFont = f.getBaseFont();
+ int style = f.style();
+ if (style == Font.UNDEFINED) {
+ style = Font.NORMAL;
+ }
+ if (baseFont == null) {
+ // translation of the font-family to a PDF font-family
+ baseFont = f.getCalculatedBaseFont(false);
+ }
+ else {
+ // bold simulation
+ if ((style & Font.BOLD) != 0)
+ attributes.put(Chunk.TEXTRENDERMODE, new Object[]{new Integer(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE), new Float(size / 30f), null});
+ // italic simulation
+ if ((style & Font.ITALIC) != 0)
+ attributes.put(Chunk.SKEW, new float[]{0, ITALIC_ANGLE});
+ }
+ font = new PdfFont(baseFont, size);
+ // other style possibilities
+ HashMap attr = chunk.getAttributes();
+ if (attr != null) {
+ for (Iterator i = attr.keySet().iterator(); i.hasNext();) {
+ Object name = i.next();
+ if (keysAttributes.containsKey(name)) {
+ attributes.put(name, attr.get(name));
+ }
+ else if (keysNoStroke.containsKey(name)) {
+ noStroke.put(name, attr.get(name));
+ }
+ }
+ if ("".equals(attr.get(Chunk.GENERICTAG))) {
+ attributes.put(Chunk.GENERICTAG, chunk.content());
+ }
+ }
+ if (f.isUnderlined()) {
+ Object obj[] = {null, new float[]{0, 1f / 15, 0, -1f / 3, 0}};
+ Object unders[][] = Chunk.addToArray((Object[][])attributes.get(Chunk.UNDERLINE), obj);
+ attributes.put(Chunk.UNDERLINE, unders);
+ }
+ if (f.isStrikethru()) {
+ Object obj[] = {null, new float[]{0, 1f / 15, 0, 1f / 3, 0}};
+ Object unders[][] = Chunk.addToArray((Object[][])attributes.get(Chunk.UNDERLINE), obj);
+ attributes.put(Chunk.UNDERLINE, unders);
+ }
+ if (action != null)
+ attributes.put(Chunk.ACTION, action);
+ // the color can't be stored in a PdfFont
+ noStroke.put(Chunk.COLOR, f.color());
+ noStroke.put(Chunk.ENCODING, font.getFont().getEncoding());
+ Object obj[] = (Object[])attributes.get(Chunk.IMAGE);
+ if (obj == null) {
+ image = null;
+ }
+ else {
+ attributes.remove(Chunk.HSCALE); // images are scaled in other ways
+ image = (Image)obj[0];
+ offsetX = ((Float)obj[1]).floatValue();
+ offsetY = ((Float)obj[2]).floatValue();
+ changeLeading = ((Boolean)obj[3]).booleanValue();
+ }
+ font.setImage(image);
+ Float hs = (Float)attributes.get(Chunk.HSCALE);
+ if (hs != null)
+ font.setHorizontalScaling(hs.floatValue());
+ encoding = font.getFont().getEncoding();
+ splitCharacter = (SplitCharacter)noStroke.get(Chunk.SPLITCHARACTER);
+ if (splitCharacter == null)
+ splitCharacter = this;
+ }
+
+ // methods
+
+ /** Gets the Unicode equivalent to a CID.
+ * The (inexistent) CID <FF00> is translated as '\n'.
+ * It has only meaning with CJK fonts with Identity encoding.
+ * @param c the CID code
+ * @return the Unicode equivalent
+ */
+ public char getUnicodeEquivalent(char c) {
+ return baseFont.getUnicodeEquivalent(c);
+ }
+
+ protected int getWord(String text, int start) {
+ int len = text.length();
+ while (start < len) {
+ if (!Character.isLetter(text.charAt(start)))
+ break;
+ ++start;
+ }
+ return start;
+ }
+
+/**
+ * Splits this <CODE>PdfChunk</CODE> if it's too long for the given width.
+ * <P>
+ * Returns <VAR>null</VAR> if the <CODE>PdfChunk</CODE> wasn't truncated.
+ *
+ * @param width a given width
+ * @return the <CODE>PdfChunk</CODE> that doesn't fit into the width.
+ */
+
+ PdfChunk split(float width) {
+ newlineSplit = false;
+ if (image != null) {
+ if (image.scaledWidth() > width) {
+ PdfChunk pc = new PdfChunk(Chunk.OBJECT_REPLACEMENT_CHARACTER, this);
+ value = "";
+ attributes = new HashMap();
+ image = null;
+ font = PdfFont.getDefaultFont();
+ return pc;
+ }
+ else
+ return null;
+ }
+ HyphenationEvent hyphenationEvent = (HyphenationEvent)noStroke.get(Chunk.HYPHENATION);
+ int currentPosition = 0;
+ int splitPosition = -1;
+ float currentWidth = 0;
+
+ // loop over all the characters of a string
+ // or until the totalWidth is reached
+ int lastSpace = -1;
+ float lastSpaceWidth = 0;
+ int length = value.length();
+ char valueArray[] = value.toCharArray();
+ char character = 0;
+ BaseFont ft = font.getFont();
+ if (ft.getFontType() == BaseFont.FONT_TYPE_CJK && ft.getUnicodeEquivalent(' ') != ' ') {
+ while (currentPosition < length) {
+ // the width of every character is added to the currentWidth
+ char cidChar = valueArray[currentPosition];
+ character = ft.getUnicodeEquivalent(cidChar);
+ // if a newLine or carriageReturn is encountered
+ if (character == '\n') {
+ newlineSplit = true;
+ String returnValue = value.substring(currentPosition + 1);
+ value = value.substring(0, currentPosition);
+ if (value.length() < 1) {
+ value = "\u0001";
+ }
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+ currentWidth += font.width(cidChar);
+ if (character == ' ') {
+ lastSpace = currentPosition + 1;
+ lastSpaceWidth = currentWidth;
+ }
+ if (currentWidth > width)
+ break;
+ // if a split-character is encountered, the splitPosition is altered
+ if (splitCharacter.isSplitCharacter(0, currentPosition, length, valueArray, thisChunk))
+ splitPosition = currentPosition + 1;
+ currentPosition++;
+ }
+ }
+ else {
+ while (currentPosition < length) {
+ // the width of every character is added to the currentWidth
+ character = valueArray[currentPosition];
+ // if a newLine or carriageReturn is encountered
+ if (character == '\r' || character == '\n') {
+ newlineSplit = true;
+ int inc = 1;
+ if (character == '\r' && currentPosition + 1 < length && valueArray[currentPosition + 1] == '\n')
+ inc = 2;
+ String returnValue = value.substring(currentPosition + inc);
+ value = value.substring(0, currentPosition);
+ if (value.length() < 1) {
+ value = " ";
+ }
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+ currentWidth += font.width(character);
+ if (character == ' ') {
+ lastSpace = currentPosition + 1;
+ lastSpaceWidth = currentWidth;
+ }
+ if (currentWidth > width)
+ break;
+ // if a split-character is encountered, the splitPosition is altered
+ if (splitCharacter.isSplitCharacter(0, currentPosition, length, valueArray, null))
+ splitPosition = currentPosition + 1;
+ currentPosition++;
+ }
+ }
+
+ // if all the characters fit in the total width, null is returned (there is no overflow)
+ if (currentPosition == length) {
+ return null;
+ }
+ // otherwise, the string has to be truncated
+ if (splitPosition < 0) {
+ String returnValue = value;
+ value = "";
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+ if (lastSpace > splitPosition && splitCharacter.isSplitCharacter(0, 0, 1, singleSpace, null))
+ splitPosition = lastSpace;
+ if (hyphenationEvent != null && lastSpace < currentPosition) {
+ int wordIdx = getWord(value, lastSpace);
+ if (wordIdx > lastSpace) {
+ String pre = hyphenationEvent.getHyphenatedWordPre(value.substring(lastSpace, wordIdx), font.getFont(), font.size(), width - lastSpaceWidth);
+ String post = hyphenationEvent.getHyphenatedWordPost();
+ if (pre.length() > 0) {
+ String returnValue = post + value.substring(wordIdx);
+ value = trim(value.substring(0, lastSpace) + pre);
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+ }
+ }
+ String returnValue = value.substring(splitPosition);
+ value = trim(value.substring(0, splitPosition));
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+
+/**
+ * Truncates this <CODE>PdfChunk</CODE> if it's too long for the given width.
+ * <P>
+ * Returns <VAR>null</VAR> if the <CODE>PdfChunk</CODE> wasn't truncated.
+ *
+ * @param width a given width
+ * @return the <CODE>PdfChunk</CODE> that doesn't fit into the width.
+ */
+
+ PdfChunk truncate(float width) {
+ if (image != null) {
+ if (image.scaledWidth() > width) {
+ PdfChunk pc = new PdfChunk("", this);
+ value = "";
+ attributes.remove(Chunk.IMAGE);
+ image = null;
+ font = PdfFont.getDefaultFont();
+ return pc;
+ }
+ else
+ return null;
+ }
+
+ int currentPosition = 0;
+ float currentWidth = 0;
+
+ // it's no use trying to split if there isn't even enough place for a space
+ if (width < font.width()) {
+ String returnValue = value.substring(1);
+ value = value.substring(0, 1);
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+
+ // loop over all the characters of a string
+ // or until the totalWidth is reached
+ int length = value.length();
+ char character;
+ while (currentPosition < length) {
+ // the width of every character is added to the currentWidth
+ character = value.charAt(currentPosition);
+ currentWidth += font.width(character);
+ if (currentWidth > width)
+ break;
+ currentPosition++;
+ }
+
+ // if all the characters fit in the total width, null is returned (there is no overflow)
+ if (currentPosition == length) {
+ return null;
+ }
+
+ // otherwise, the string has to be truncated
+ //currentPosition -= 2;
+ // we have to chop off minimum 1 character from the chunk
+ if (currentPosition == 0) {
+ currentPosition = 1;
+ }
+ String returnValue = value.substring(currentPosition);
+ value = value.substring(0, currentPosition);
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+
+ // methods to retrieve the membervariables
+
+/**
+ * Returns the font of this <CODE>Chunk</CODE>.
+ *
+ * @return a <CODE>PdfFont</CODE>
+ */
+
+ PdfFont font() {
+ return font;
+ }
+
+/**
+ * Returns the color of this <CODE>Chunk</CODE>.
+ *
+ * @return a <CODE>Color</CODE>
+ */
+
+ Color color() {
+ return (Color)noStroke.get(Chunk.COLOR);
+ }
+
+/**
+ * Returns the width of this <CODE>PdfChunk</CODE>.
+ *
+ * @return a width
+ */
+
+ float width() {
+ return font.width(value);
+ }
+
+/**
+ * Checks if the <CODE>PdfChunk</CODE> split was caused by a newline.
+ * @return <CODE>true</CODE> if the <CODE>PdfChunk</CODE> split was caused by a newline.
+ */
+
+ public boolean isNewlineSplit()
+ {
+ return newlineSplit;
+ }
+
+/**
+ * Gets the width of the <CODE>PdfChunk</CODE> taking into account the
+ * extra character and word spacing.
+ * @param charSpacing the extra character spacing
+ * @param wordSpacing the extra word spacing
+ * @return the calculated width
+ */
+
+ public float getWidthCorrected(float charSpacing, float wordSpacing)
+ {
+ if (image != null) {
+ return image.scaledWidth() + charSpacing;
+ }
+ int numberOfSpaces = 0;
+ int idx = -1;
+ while ((idx = value.indexOf(' ', idx + 1)) >= 0)
+ ++numberOfSpaces;
+ return width() + (value.length() * charSpacing + numberOfSpaces * wordSpacing);
+ }
+
+ /**
+ * Gets the text displacement relatiev to the baseline.
+ * @return a displacement in points
+ */
+ public float getTextRise() {
+ Float f = (Float) getAttribute(Chunk.SUBSUPSCRIPT);
+ if (f != null) {
+ return f.floatValue();
+ }
+ return 0.0f;
+ }
+
+/**
+ * Trims the last space.
+ * @return the width of the space trimmed, otherwise 0
+ */
+
+ public float trimLastSpace()
+ {
+ BaseFont ft = font.getFont();
+ if (ft.getFontType() == BaseFont.FONT_TYPE_CJK && ft.getUnicodeEquivalent(' ') != ' ') {
+ if (value.length() > 1 && value.endsWith("\u0001")) {
+ value = value.substring(0, value.length() - 1);
+ return font.width('\u0001');
+ }
+ }
+ else {
+ if (value.length() > 1 && value.endsWith(" ")) {
+ value = value.substring(0, value.length() - 1);
+ return font.width(' ');
+ }
+ }
+ return 0;
+ }
+
+/**
+ * Gets an attribute. The search is made in <CODE>attributes</CODE>
+ * and <CODE>noStroke</CODE>.
+ * @param name the attribute key
+ * @return the attribute value or null if not found
+ */
+
+ Object getAttribute(String name)
+ {
+ if (attributes.containsKey(name))
+ return attributes.get(name);
+ return noStroke.get(name);
+ }
+
+/**
+ *Checks if the attribute exists.
+ * @param name the attribute key
+ * @return <CODE>true</CODE> if the attribute exists
+ */
+
+ boolean isAttribute(String name)
+ {
+ if (attributes.containsKey(name))
+ return true;
+ return noStroke.containsKey(name);
+ }
+
+/**
+ * Checks if this <CODE>PdfChunk</CODE> needs some special metrics handling.
+ * @return <CODE>true</CODE> if this <CODE>PdfChunk</CODE> needs some special metrics handling.
+ */
+
+ boolean isStroked()
+ {
+ return (attributes.size() > 0);
+ }
+
+/**
+ * Checks if there is an image in the <CODE>PdfChunk</CODE>.
+ * @return <CODE>true</CODE> if an image is present
+ */
+
+ boolean isImage()
+ {
+ return image != null;
+ }
+
+/**
+ * Gets the image in the <CODE>PdfChunk</CODE>.
+ * @return the image or <CODE>null</CODE>
+ */
+
+ Image getImage()
+ {
+ return image;
+ }
+
+/**
+ * Sets the image offset in the x direction
+ * @param offsetX the image offset in the x direction
+ */
+
+ void setImageOffsetX(float offsetX)
+ {
+ this.offsetX = offsetX;
+ }
+
+/**
+ * Gets the image offset in the x direction
+ * @return the image offset in the x direction
+ */
+
+ float getImageOffsetX()
+ {
+ return offsetX;
+ }
+
+/**
+ * Sets the image offset in the y direction
+ * @param offsetY the image offset in the y direction
+ */
+
+ void setImageOffsetY(float offsetY)
+ {
+ this.offsetY = offsetY;
+ }
+
+/**
+ * Gets the image offset in the y direction
+ * @return Gets the image offset in the y direction
+ */
+
+ float getImageOffsetY()
+ {
+ return offsetY;
+ }
+
+/**
+ * sets the value.
+ * @param value content of the Chunk
+ */
+
+ void setValue(String value)
+ {
+ this.value = value;
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString() {
+ return value;
+ }
+
+ /**
+ * Tells you if this string is in Chinese, Japanese, Korean or Identity-H.
+ * @return true if the Chunk has a special encoding
+ */
+
+ boolean isSpecialEncoding() {
+ return encoding.equals(CJKFont.CJK_ENCODING) || encoding.equals(BaseFont.IDENTITY_H);
+ }
+
+ /**
+ * Gets the encoding of this string.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ String getEncoding() {
+ return encoding;
+ }
+
+ int length() {
+ return value.length();
+ }
+/**
+ * Checks if a character can be used to split a <CODE>PdfString</CODE>.
+ * <P>
+ * for the moment every character less than or equal to SPACE and the character '-' are 'splitCharacters'.
+ *
+ * @param start start position in the array
+ * @param current current position in the array
+ * @param end end position in the array
+ * @param cc the character array that has to be checked
+ * @param ck chunk array
+ * @return <CODE>true</CODE> if the character can be used to split a string, <CODE>false</CODE> otherwise
+ */
+ public boolean isSplitCharacter(int start, int current, int end, char[] cc, PdfChunk[] ck) {
+ char c;
+ if (ck == null)
+ c = cc[current];
+ else
+ c = ck[Math.min(current, ck.length - 1)].getUnicodeEquivalent(cc[current]);
+ if (c <= ' ' || c == '-') {
+ return true;
+ }
+ if (c < 0x2e80)
+ return false;
+ return ((c >= 0x2e80 && c < 0xd7a0)
+ || (c >= 0xf900 && c < 0xfb00)
+ || (c >= 0xfe30 && c < 0xfe50)
+ || (c >= 0xff61 && c < 0xffa0));
+ }
+
+ boolean isExtSplitCharacter(int start, int current, int end, char[] cc, PdfChunk[] ck) {
+ return splitCharacter.isSplitCharacter(start, current, end, cc, ck);
+ }
+
+/**
+ * Removes all the <VAR>' '</VAR> and <VAR>'-'</VAR>-characters on the right of a <CODE>String</CODE>.
+ * <P>
+ * @param string the <CODE>String<CODE> that has to be trimmed.
+ * @return the trimmed <CODE>String</CODE>
+ */
+ String trim(String string) {
+ BaseFont ft = font.getFont();
+ if (ft.getFontType() == BaseFont.FONT_TYPE_CJK && ft.getUnicodeEquivalent(' ') != ' ') {
+ while (string.endsWith("\u0001")) {
+ string = string.substring(0, string.length() - 1);
+ }
+ }
+ else {
+ while (string.endsWith(" ") || string.endsWith("\t")) {
+ string = string.substring(0, string.length() - 1);
+ }
+ }
+ return string;
+ }
+
+ public boolean changeLeading() {
+ return changeLeading;
+ }
+
+ float getCharWidth(char c) {
+ if (noPrint(c))
+ return 0;
+ return font.width(c);
+ }
+
+ public static boolean noPrint(char c) {
+ return ((c >= 0x200b && c <= 0x200f) || (c >= 0x202a && c <= 0x202e));
+ }
+
+} \ No newline at end of file