From de740d5754cab495e6d8ccd894f33b5fffb2cf77 Mon Sep 17 00:00:00 2001 From: "Hugh.C" Date: Thu, 31 Oct 2019 14:30:21 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-23453=20html=E5=88=87=E5=89=B2=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E4=B8=A2=E5=A4=B1
=20=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../third/v2/lowagie/text/pdf/PdfChunk.java | 157 ++++++++++-------- .../fr/third/v2/lowagie/text/pdf/PdfLine.java | 14 +- 2 files changed, 97 insertions(+), 74 deletions(-) diff --git a/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfChunk.java b/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfChunk.java index f5b67439a..8d014cd80 100644 --- a/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfChunk.java +++ b/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfChunk.java @@ -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 = "
"; + + 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 PdfChunk. */ protected PdfFont font; @@ -164,7 +170,7 @@ public class PdfChunk { * such as underline. */ protected HashMap attributes = new HashMap(); - + /** * Non metric attributes. *

@@ -172,16 +178,16 @@ public class PdfChunk { * such as Color. */ protected HashMap noStroke = new HashMap(); - + /** true if the chunk split was cause by a newline. */ protected boolean newlineSplit; - + /** The image in this PdfChunk, 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 PdfChunk-object. * * @param string the content of the PdfChunk-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 PdfChunk-object. * * @param chunk the original Chunk-object * @param action the PdfAction if the Chunk comes from an Anchor */ - + 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 is translated as '\n'. + * The (inexistent) CID 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 PdfChunk 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 Chunk. * * @return a PdfFont */ - + PdfFont font() { return font; } - + /** * Returns the color of this Chunk. * * @return a Color */ - + Color color() { return (Color)noStroke.get(Chunk.COLOR); } - + /** * Returns the width of this PdfChunk. * * @return a width */ - + public float width() { return font.width(value) + indent.getLeft() + indent.getRight(); } - + /** * Checks if the PdfChunk split was caused by a newline. * @return true if the PdfChunk split was caused by a newline. */ - + public boolean isNewlineSplit() { return newlineSplit; } - + /** * Gets the width of the PdfChunk 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 attributes * and noStroke. * @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 true if the attribute exists */ - + boolean isAttribute(String name) { if (attributes.containsKey(name)) return true; return noStroke.containsKey(name); } - + /** * Checks if this PdfChunk needs some special metrics handling. * @return true if this PdfChunk needs some special metrics handling. */ - + boolean isStroked() { return (!attributes.isEmpty()); } - + /** * Checks if this PdfChunk 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 PdfChunk 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 PdfChunk 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 PdfChunk. * @return true if an image is present */ - + public boolean isImage() { return image != null; } - + /** * Gets the image in the PdfChunk. * @return the image or null */ - + 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 String */ - + 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 ' ' and '-'-characters on the right of a String. *

* @param string the String that has to be trimmed. * @return the trimmed String - */ + */ 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(""); - htmlString.append(value); + htmlString.append(breakTag ? BREAK_TAG : value); htmlString.append(""); 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; + } + } diff --git a/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfLine.java b/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfLine.java index 4752ffd8e..a4f980b3c 100644 --- a/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfLine.java +++ b/fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfLine.java @@ -91,9 +91,11 @@ public class PdfLine { /** The original width. */ protected float originalWidth; - + protected boolean isRTL = false; + + public float getHeight() { return height; } @@ -155,9 +157,15 @@ public class PdfLine { public PdfChunk add(PdfChunk chunk) { // nothing happens if the chunk is null. if (chunk == null || chunk.toString().equals("")) { - return null; + return null; } - + // add to line if the chunk is break tag ("\n") + if (chunk.isBreakTag()) { + addToLine(chunk); + width = 0; + return null; + } + // we split the chunk to be added PdfChunk overflow = chunk.split(width); newlineSplit = (chunk.isNewlineSplit() || overflow == null);