|
|
|
@ -88,6 +88,12 @@ public class PdfChunk {
|
|
|
|
|
|
|
|
|
|
private static final float FONT_SCALE = 100f; |
|
|
|
|
|
|
|
|
|
private static final String BREAK = "\n"; |
|
|
|
|
|
|
|
|
|
private static final String BREAK_TAG = "<br>"; |
|
|
|
|
|
|
|
|
|
private boolean breakTag = false; |
|
|
|
|
|
|
|
|
|
public float getHeight() { |
|
|
|
|
return height; |
|
|
|
|
} |
|
|
|
@ -135,16 +141,16 @@ public class PdfChunk {
|
|
|
|
|
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; |
|
|
|
|
|
|
|
|
@ -164,7 +170,7 @@ public class PdfChunk {
|
|
|
|
|
* such as underline. |
|
|
|
|
*/ |
|
|
|
|
protected HashMap attributes = new HashMap(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Non metric attributes. |
|
|
|
|
* <P> |
|
|
|
@ -172,16 +178,16 @@ public class PdfChunk {
|
|
|
|
|
* 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; |
|
|
|
|
|
|
|
|
@ -189,17 +195,18 @@ public class PdfChunk {
|
|
|
|
|
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; |
|
|
|
|
updateBreakTag(); |
|
|
|
|
this.font = other.font; |
|
|
|
|
this.attributes = other.attributes; |
|
|
|
|
this.noStroke = other.noStroke; |
|
|
|
@ -217,18 +224,18 @@ public class PdfChunk {
|
|
|
|
|
splitCharacter = DefaultSplitCharacter.DEFAULT; |
|
|
|
|
this.height = other.getHeight(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 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> |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public PdfChunk(Chunk chunk, PdfAction action) { |
|
|
|
|
thisChunk[0] = this; |
|
|
|
|
value = chunk.getContent(); |
|
|
|
|
|
|
|
|
|
updateBreakTag(); |
|
|
|
|
Font f = chunk.getFont(); |
|
|
|
|
float size = f.getSize(); |
|
|
|
|
if (size == Font.UNDEFINED) |
|
|
|
@ -302,15 +309,15 @@ public class PdfChunk {
|
|
|
|
|
if (splitCharacter == null) |
|
|
|
|
splitCharacter = DefaultSplitCharacter.DEFAULT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// methods
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Gets the Unicode equivalent to a CID. |
|
|
|
|
* The (inexistent) CID <FF00> is translated as '\n'. |
|
|
|
|
* 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 int getUnicodeEquivalent(int c) { |
|
|
|
|
return c; |
|
|
|
|
} |
|
|
|
@ -407,7 +414,7 @@ public class PdfChunk {
|
|
|
|
|
* @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.getScaledWidth() + indent.getLeft() + indent.getRight() > width) { |
|
|
|
@ -421,10 +428,10 @@ public class PdfChunk {
|
|
|
|
|
else |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int currentPosition = 0; |
|
|
|
|
float currentWidth = indent.getLeft(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// it's no use trying to split if there isn't even enough place for a space
|
|
|
|
|
if (width < font.width() + indent.getLeft() + indent.getRight()) { |
|
|
|
|
String returnValue = value.substring(1); |
|
|
|
@ -432,7 +439,7 @@ public class PdfChunk {
|
|
|
|
|
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(); |
|
|
|
@ -451,12 +458,12 @@ public class PdfChunk {
|
|
|
|
|
currentPosition++; |
|
|
|
|
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
|
|
|
|
@ -470,49 +477,49 @@ public class PdfChunk {
|
|
|
|
|
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 |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public float width() { |
|
|
|
|
return font.width(value) + indent.getLeft() + indent.getRight(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 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. |
|
|
|
@ -520,7 +527,7 @@ public class PdfChunk {
|
|
|
|
|
* @param wordSpacing the extra word spacing |
|
|
|
|
* @return the calculated width |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public float getWidthCorrected(float charSpacing, float wordSpacing) |
|
|
|
|
{ |
|
|
|
|
if (image != null) { |
|
|
|
@ -532,7 +539,7 @@ public class PdfChunk {
|
|
|
|
|
++numberOfSpaces; |
|
|
|
|
return width() + (value.length() * charSpacing + numberOfSpaces * wordSpacing); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Gets the text displacement relative to the baseline. |
|
|
|
|
* @return a displacement in points |
|
|
|
@ -544,7 +551,7 @@ public class PdfChunk {
|
|
|
|
|
} |
|
|
|
|
return 0.0f; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Trims the last space. |
|
|
|
|
* @return the width of the space trimmed, otherwise 0 |
|
|
|
@ -565,44 +572,44 @@ public class PdfChunk {
|
|
|
|
|
} |
|
|
|
|
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 |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public 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.isEmpty()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Checks if this <CODE>PdfChunk</CODE> is a Separator Chunk. |
|
|
|
|
* @return true if this chunk is a separator. |
|
|
|
@ -611,7 +618,7 @@ public class PdfChunk {
|
|
|
|
|
boolean isSeparator() { |
|
|
|
|
return isAttribute(Chunk.SEPARATOR); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Checks if this <CODE>PdfChunk</CODE> is a horizontal Separator Chunk. |
|
|
|
|
* @return true if this chunk is a horizontal separator. |
|
|
|
@ -624,7 +631,7 @@ public class PdfChunk {
|
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Checks if this <CODE>PdfChunk</CODE> is a tab Chunk. |
|
|
|
|
* @return true if this chunk is a separator. |
|
|
|
@ -633,7 +640,7 @@ public class PdfChunk {
|
|
|
|
|
boolean isTab() { |
|
|
|
|
return isAttribute(Chunk.TAB); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Correction for the tab position based on the left starting position. |
|
|
|
|
* @param newValue the new value for the left X. |
|
|
|
@ -645,72 +652,72 @@ public class PdfChunk {
|
|
|
|
|
attributes.put(Chunk.TAB, new Object[]{o[0], o[1], o[2], new Float(newValue)}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Checks if there is an image in the <CODE>PdfChunk</CODE>. |
|
|
|
|
* @return <CODE>true</CODE> if an image is present |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public boolean isImage() |
|
|
|
|
{ |
|
|
|
|
return image != null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Gets the image in the <CODE>PdfChunk</CODE>. |
|
|
|
|
* @return the image or <CODE>null</CODE> |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public 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; |
|
|
|
@ -727,17 +734,17 @@ public class PdfChunk {
|
|
|
|
|
* 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; |
|
|
|
|
} |
|
|
|
@ -745,7 +752,7 @@ public class PdfChunk {
|
|
|
|
|
int length() { |
|
|
|
|
return value.length(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int lengthUtf32() { |
|
|
|
|
if (!BaseFont.IDENTITY_H.equals(encoding)) |
|
|
|
|
return value.length(); |
|
|
|
@ -758,17 +765,17 @@ public class PdfChunk {
|
|
|
|
|
} |
|
|
|
|
return total; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) { |
|
|
|
|
while (string.endsWith(" ") || string.endsWith("\t")) { |
|
|
|
|
string = string.substring(0, string.length() - 1); |
|
|
|
@ -779,7 +786,7 @@ public class PdfChunk {
|
|
|
|
|
public boolean changeLeading() { |
|
|
|
|
return changeLeading; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float getCharWidth(int c) { |
|
|
|
|
if (noPrint(c)) |
|
|
|
|
return 0; |
|
|
|
@ -798,7 +805,7 @@ public class PdfChunk {
|
|
|
|
|
htmlString.append("<span style='"); |
|
|
|
|
htmlString.append(getStyleAttributes()).append("'"); |
|
|
|
|
htmlString.append(">"); |
|
|
|
|
htmlString.append(value); |
|
|
|
|
htmlString.append(breakTag ? BREAK_TAG : value); |
|
|
|
|
htmlString.append("</span>"); |
|
|
|
|
return htmlString.toString(); |
|
|
|
|
} |
|
|
|
@ -856,4 +863,12 @@ public class PdfChunk {
|
|
|
|
|
return indent.getLeft(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void updateBreakTag() { |
|
|
|
|
breakTag = BREAK.equals(value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean isBreakTag() { |
|
|
|
|
return breakTag; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|