Browse Source

research/11.0
kerry 6 years ago
parent
commit
f8c3aeed1d
  1. 1
      fine-itext/src/com/fr/third/v2/lowagie/text/html/CSS.java
  2. 14
      fine-itext/src/com/fr/third/v2/lowagie/text/html/CSSUtils.java
  3. 80
      fine-itext/src/com/fr/third/v2/lowagie/text/html/SpaceWithPunctuationBreakIterator.java
  4. 6
      fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/ChainedProperties.java
  5. 10
      fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/HTMLWorker.java
  6. 45
      fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/IncCell.java
  7. 98
      fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/IncTable.java
  8. 58
      fine-itext/src/com/fr/third/v2/lowagie/text/pdf/BorderStyle.java
  9. 12
      fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfBlock.java
  10. 113
      fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfChunk.java
  11. 34
      fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfPCell.java
  12. 30
      fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfPRow.java
  13. 660
      fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfPTable.java
  14. 52
      fine-itext/src/com/fr/third/v2/lowagie/text/pdf/TableProperties.java

1
fine-itext/src/com/fr/third/v2/lowagie/text/html/CSS.java

@ -109,6 +109,7 @@ public class CSS{
public static final String BACKGROUND_ATTACHMENT = "background-attachment"; public static final String BACKGROUND_ATTACHMENT = "background-attachment";
public static final String BACKGROUND_POSITION = "background-position"; public static final String BACKGROUND_POSITION = "background-position";
public static final String BACKGROUND_COLOR = "background-color"; public static final String BACKGROUND_COLOR = "background-color";
public static final String BACKGROUND_SIZE = "background-size";
public static final String LIST_STYLE = "list-style"; public static final String LIST_STYLE = "list-style";
public static final String LIST_STYLE_TYPE = "list-style-type"; public static final String LIST_STYLE_TYPE = "list-style-type";
public static final String LIST_STYLE_POSITION = "list-style-position"; public static final String LIST_STYLE_POSITION = "list-style-position";

14
fine-itext/src/com/fr/third/v2/lowagie/text/html/CSSUtils.java

@ -88,4 +88,18 @@ public class CSSUtils {
} }
return str; return str;
} }
public static Float parseFloat(String str){
float result = 0.0f;
try {
if(str.endsWith("px") || str.endsWith("pt")){
result = Float.parseFloat(str.substring(0, str.length() - 2));
}else{
result = Float.parseFloat(str);
}
}catch (NumberFormatException e){
}
return result;
}
} }

80
fine-itext/src/com/fr/third/v2/lowagie/text/html/SpaceWithPunctuationBreakIterator.java

@ -0,0 +1,80 @@
package com.fr.third.v2.lowagie.text.html;
import com.fr.third.ibm.icu.text.BreakIterator;
import java.text.CharacterIterator;
/**
* 之前性能插件里面的考虑空格和标点符号的分词iterator
*/
public class SpaceWithPunctuationBreakIterator extends BreakIterator {
private BreakIterator iterator;
private int currentPos = -1;
private int currentIndex = -1;
private boolean[] spaceIndex;
public SpaceWithPunctuationBreakIterator(String text, BreakIterator iterator){
this.iterator = iterator;
iterator.setText(text);
this.spaceIndex = new boolean[text.length()];
int ilen = text.length() - 1;
if(ilen > 0) {
for (int i = 0; i < ilen; i++) {
char c = text.charAt(i);
spaceIndex[i + 1] = (c == ' ' && isPunctuation(text.charAt(i + 1)) )|| c == '-' || c == '\u2010' || c== '\n';
}
}
}
public boolean isPunctuation(char c) {
int code = Character.getType(c);
return code == 24 || code == 20 || code == 21 || code == 22 || code == 23;
}
public int first() {
throw new UnsupportedOperationException();
}
public int last() {
throw new UnsupportedOperationException();
}
public int next(int n) {
throw new UnsupportedOperationException();
}
public int next() {
if(currentIndex == currentPos) {
currentPos = this.iterator.next();
}
for(int i = currentIndex + 1; i < currentPos; i++){
if(spaceIndex[i]){
currentIndex = i;
return currentIndex;
}
}
currentIndex = currentPos;
return currentIndex;
}
public int previous() {
throw new UnsupportedOperationException();
}
public int following(int offset) {
throw new UnsupportedOperationException();
}
public int current() {
throw new UnsupportedOperationException();
}
public CharacterIterator getText() {
throw new UnsupportedOperationException();
}
public void setText(CharacterIterator newText) {
throw new UnsupportedOperationException();
}
}

6
fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/ChainedProperties.java

@ -76,6 +76,12 @@ public class ChainedProperties {
return null; return null;
} }
public String getLastChainProperty(String key){
Object obj[] = (Object[]) chain.get(chain.size()-1);
HashMap prop = (HashMap) obj[1];
return (String) prop.get(key);
}
public boolean hasProperty(String key) { public boolean hasProperty(String key) {
for (int k = chain.size() - 1; k >= 0; --k) { for (int k = chain.size() - 1; k >= 0; --k) {
Object obj[] = (Object[]) chain.get(k); Object obj[] = (Object[]) chain.get(k);

10
fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/HTMLWorker.java

@ -72,6 +72,7 @@ import com.fr.third.v2.lowagie.text.List;
import com.fr.third.v2.lowagie.text.ListItem; import com.fr.third.v2.lowagie.text.ListItem;
import com.fr.third.v2.lowagie.text.Rectangle; import com.fr.third.v2.lowagie.text.Rectangle;
import com.fr.third.v2.lowagie.text.TextElementArray; import com.fr.third.v2.lowagie.text.TextElementArray;
import com.fr.third.v2.lowagie.text.html.CSSUtils;
import com.fr.third.v2.lowagie.text.html.HtmlTags; import com.fr.third.v2.lowagie.text.html.HtmlTags;
import com.fr.third.v2.lowagie.text.pdf.draw.LineSeparator; import com.fr.third.v2.lowagie.text.pdf.draw.LineSeparator;
import com.fr.third.v2.lowagie.text.xml.simpleparser.SimpleXMLDocHandler; import com.fr.third.v2.lowagie.text.xml.simpleparser.SimpleXMLDocHandler;
@ -648,6 +649,8 @@ public class HTMLWorker implements SimpleXMLDocHandler, DocListener {
if (pendingTD) if (pendingTD)
endElement("td"); endElement("td");
pendingTR = false; pendingTR = false;
String rowHeightPx = cprops.getLastChainProperty("height");
cprops.removeChain("tr"); cprops.removeChain("tr");
ArrayList cells = new ArrayList(); ArrayList cells = new ArrayList();
IncTable table = null; IncTable table = null;
@ -661,8 +664,13 @@ public class HTMLWorker implements SimpleXMLDocHandler, DocListener {
break; break;
} }
} }
float rowHeight = 0.0f;
if(rowHeightPx!=null){
rowHeight = CSSUtils.parseFloat(rowHeightPx);
}
table.addCols(cells); table.addCols(cells);
table.endRow(); table.endRow(rowHeight);
stack.push(table); stack.push(table);
skipText = true; skipText = true;
return; return;

45
fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/IncCell.java

@ -48,10 +48,13 @@
package com.fr.third.v2.lowagie.text.html.simpleparser; package com.fr.third.v2.lowagie.text.html.simpleparser;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import com.fr.third.v2.lowagie.text.Element; import com.fr.third.v2.lowagie.text.Element;
import com.fr.third.v2.lowagie.text.ElementListener; import com.fr.third.v2.lowagie.text.ElementListener;
import com.fr.third.v2.lowagie.text.TextElementArray; import com.fr.third.v2.lowagie.text.TextElementArray;
import com.fr.third.v2.lowagie.text.html.CSSUtils;
import com.fr.third.v2.lowagie.text.html.Markup; import com.fr.third.v2.lowagie.text.html.Markup;
import com.fr.third.v2.lowagie.text.pdf.PdfPCell; import com.fr.third.v2.lowagie.text.pdf.PdfPCell;
import com.fr.third.v2.lowagie.text.Phrase; import com.fr.third.v2.lowagie.text.Phrase;
@ -95,14 +98,52 @@ public class IncCell implements TextElementArray {
value = props.getProperty("border"); value = props.getProperty("border");
float border = 0; float border = 0;
if (value != null) if (value != null)
border = Float.parseFloat(value); border = CSSUtils.parseFloat(value);
cell.setBorderWidth(border); cell.setBorderWidth(border);
value = props.getProperty("cellpadding"); value = props.getProperty("cellpadding");
if (value != null) if (value != null)
cell.setPadding(Float.parseFloat(value)); cell.setPadding(CSSUtils.parseFloat(value));
cell.setUseDescender(true); cell.setUseDescender(true);
value = props.getProperty("bgcolor"); value = props.getProperty("bgcolor");
cell.setBackgroundColor(Markup.decodeColor(value)); cell.setBackgroundColor(Markup.decodeColor(value));
//解析td上声明的width
value = props.getLastChainProperty("width");
if(value != null){
cell.setStyleWidth(CSSUtils.parseFloat(value));
}
//解析td上声明的height
value = props.getLastChainProperty("height");
if(value != null){
cell.setStyleHeight(CSSUtils.parseFloat(value));
}
//解析background相关属性并保存到cell对象
Map<String, String> backgroundRules = new HashMap<String, String>();
value = props.getLastChainProperty("background-size");
if(value!=null){
backgroundRules.put("background-size", value);
}
value = props.getLastChainProperty("background");
if(value!=null){
Map<String, String> backgroundStyles = CSSUtils.processBackground(value);
backgroundRules.putAll(backgroundStyles);
}
value = props.getLastChainProperty("background-color");
if(value!=null){
backgroundRules.put("background-color", value);
}
value = props.getLastChainProperty("background-position");
if(value!=null){
backgroundRules.put("background-position", value);
}
value = props.getLastChainProperty("background-repeat");
if(value!=null){
backgroundRules.put("background-repeat", value);
}
value = props.getLastChainProperty("background-image");
if(value!=null){
backgroundRules.put("background-image", value);
}
cell.setBackground(backgroundRules);
} }
public boolean add(Object o) { public boolean add(Object o) {

98
fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/IncTable.java

@ -51,8 +51,12 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import com.fr.third.v2.lowagie.text.html.CSSUtils;
import com.fr.third.v2.lowagie.text.html.Markup;
import com.fr.third.v2.lowagie.text.pdf.BorderStyle;
import com.fr.third.v2.lowagie.text.pdf.PdfPTable; import com.fr.third.v2.lowagie.text.pdf.PdfPTable;
import com.fr.third.v2.lowagie.text.pdf.PdfPCell; import com.fr.third.v2.lowagie.text.pdf.PdfPCell;
import com.fr.third.v2.lowagie.text.pdf.TableProperties;
/** /**
* *
@ -62,6 +66,8 @@ public class IncTable {
private HashMap props = new HashMap(); private HashMap props = new HashMap();
private ArrayList rows = new ArrayList(); private ArrayList rows = new ArrayList();
private ArrayList cols; private ArrayList cols;
private ArrayList<Float> rowHeights = new ArrayList<Float>();
/** Creates a new instance of IncTable */ /** Creates a new instance of IncTable */
public IncTable(HashMap props) { public IncTable(HashMap props) {
this.props.putAll(props); this.props.putAll(props);
@ -80,7 +86,8 @@ public class IncTable {
cols.addAll(ncols); cols.addAll(ncols);
} }
public void endRow() { public void endRow(float rowHeight) {
rowHeights.add(rowHeight);
if (cols != null) { if (cols != null) {
Collections.reverse(cols); Collections.reverse(cols);
rows.add(cols); rows.add(cols);
@ -97,27 +104,88 @@ public class IncTable {
return new PdfPTable(1); return new PdfPTable(1);
int ncol = 0; int ncol = 0;
ArrayList c0 = (ArrayList)rows.get(0); ArrayList c0 = (ArrayList)rows.get(0);
ArrayList<Float> colWidths = new ArrayList<Float>();
for (int k = 0; k < c0.size(); ++k) { for (int k = 0; k < c0.size(); ++k) {
ncol += ((PdfPCell)c0.get(k)).getColspan(); PdfPCell pCell = ((PdfPCell)c0.get(k));
int cellCols = pCell.getColspan();
ncol += cellCols;
if(cellCols > 1){
for(int a = 0; a < cellCols ; a++){
colWidths.add(pCell.getStyleWidth()/cellCols);
}
}else {
colWidths.add(pCell.getStyleWidth());
}
} }
PdfPTable table = new PdfPTable(ncol); PdfPTable table = new PdfPTable(ncol);
String width = (String)props.get("width"); try {
if (width == null) TableProperties tableProperties = parseTableProperties();
table.setWidthPercentage(100); table.setTableProperties(tableProperties);
else { String width = (String)props.get("width");
if (width.endsWith("%")) if (width == null)
table.setWidthPercentage(Float.parseFloat(width.substring(0, width.length() - 1))); table.setWidthPercentage(100);
else { else {
table.setTotalWidth(Float.parseFloat(width)); if (width.endsWith("%"))
table.setLockedWidth(true); table.setWidthPercentage(CSSUtils.parseFloat(width));
else {
//解析单元格宽度
float totalWidth = CSSUtils.parseFloat(width);
float[] floats = new float[colWidths.size()];
for (int a = 0; a < colWidths.size(); a++){
floats[a] = colWidths.get(a);
}
//解析px数值
table.setTotalWidth(totalWidth);
try {
table.setWidths(floats);
}catch (Exception e){
e.printStackTrace();
}
table.setLockedWidth(true);
}
} }
} for (int row = 0; row < rows.size(); ++row) {
for (int row = 0; row < rows.size(); ++row) { ArrayList col = (ArrayList)rows.get(row);
ArrayList col = (ArrayList)rows.get(row); for (int k = 0; k < col.size(); ++k) {
for (int k = 0; k < col.size(); ++k) { table.addCell((PdfPCell)col.get(k));
table.addCell((PdfPCell)col.get(k)); }
} }
//调整行高
for(int a = 0; a < rowHeights.size(); a++){
table.getRow(a).setStyleHeight(rowHeights.get(a));
}
}catch (Exception e){
e.printStackTrace();
} }
return table; return table;
} }
public TableProperties parseTableProperties(){
TableProperties tableProperties = new TableProperties();
BorderStyle borderStyle = new BorderStyle();
tableProperties.setBorderStyle(borderStyle);
String value = (String)props.get("border");
if(value != null){
borderStyle.setBorderWidth(CSSUtils.parseFloat(value));
}
value = (String)props.get("border-color");
if(value != null){
borderStyle.setBorderColor(Markup.decodeColor(value));
}
value = (String)props.get("border-collapse");
if(value != null){
tableProperties.setCollapse(value.equals("collapse"));
}
value = (String)props.get("cellspacing");
if(value != null){
tableProperties.setCellspacing(CSSUtils.parseFloat(value));
}
value = (String)props.get("cellpadding");
if(value != null){
tableProperties.setCellpadding(CSSUtils.parseFloat(value));
}
return tableProperties;
}
} }

58
fine-itext/src/com/fr/third/v2/lowagie/text/pdf/BorderStyle.java

@ -0,0 +1,58 @@
package com.fr.third.v2.lowagie.text.pdf;
import com.fr.third.v2.lowagie.text.DocumentException;
import com.fr.third.v2.lowagie.text.html.CSSUtils;
import com.fr.third.v2.lowagie.text.html.Markup;
import java.awt.Color;
public class BorderStyle {
private float borderWidth = 0.0f;
private Color borderColor = Color.black;
private String borderPattern = "solid";
public float getBorderWidth() {
return borderWidth;
}
public void setBorderWidth(float borderWidth) {
this.borderWidth = borderWidth;
}
public Color getBorderColor() {
return borderColor;
}
public void setBorderColor(Color borderColor) {
this.borderColor = borderColor;
}
public String getBorderPattern() {
return borderPattern;
}
public void setBorderPattern(String borderPattern) {
this.borderPattern = borderPattern;
}
public BorderStyle() {
}
public BorderStyle(int borderWidth, String borderPattern, Color borderColor) {
this.borderWidth = borderWidth;
this.borderPattern = borderPattern;
this.borderWidth = borderWidth;
}
public static BorderStyle parseBorderStyle(String borderString) throws DocumentException {
BorderStyle borderStyle = new BorderStyle();
String[] borderPros = borderString.split(" ");
borderStyle.setBorderWidth(CSSUtils.parseFloat(borderPros[0]));
borderStyle.setBorderPattern(borderPros[1]);
borderStyle.setBorderColor(Markup.decodeColor(borderPros[2]));
return borderStyle;
}
}

12
fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfBlock.java

@ -1,12 +0,0 @@
package com.fr.third.v2.lowagie.text.pdf;
/**
* @author kerry
* @date 2018/8/10
*/
public interface PdfBlock {
float getHeight();
void calculateHeight();
String toHtmlString(double startY, double endY);
}

113
fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfChunk.java

@ -53,8 +53,10 @@ import java.awt.Color;
import java.awt.FontMetrics; import java.awt.FontMetrics;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import com.fr.third.ibm.icu.text.BreakIterator;
import com.fr.third.v2.lowagie.text.SplitCharacter; import com.fr.third.v2.lowagie.text.SplitCharacter;
import com.fr.third.v2.lowagie.text.Utilities; import com.fr.third.v2.lowagie.text.Utilities;
import com.fr.third.v2.lowagie.text.Chunk; import com.fr.third.v2.lowagie.text.Chunk;
@ -62,6 +64,7 @@ import com.fr.third.v2.lowagie.text.Font;
import com.fr.third.v2.lowagie.text.Image; import com.fr.third.v2.lowagie.text.Image;
import com.fr.third.v2.lowagie.text.html.IndentAttribute; import com.fr.third.v2.lowagie.text.html.IndentAttribute;
import com.fr.third.v2.lowagie.text.html.ParseIndentAttrUtils; import com.fr.third.v2.lowagie.text.html.ParseIndentAttrUtils;
import com.fr.third.v2.lowagie.text.html.SpaceWithPunctuationBreakIterator;
import sun.font.FontDesignMetrics; import sun.font.FontDesignMetrics;
/** /**
@ -100,6 +103,17 @@ public class PdfChunk {
private IndentAttribute indent = new IndentAttribute(); private IndentAttribute indent = new IndentAttribute();
public Map<String, String> background ;
public Map<String, String> getBackground() {
return background;
}
public void setBackground(Map<String, String> background) {
this.background = background;
}
static { static {
keysAttributes.put(Chunk.ACTION, null); keysAttributes.put(Chunk.ACTION, null);
keysAttributes.put(Chunk.UNDERLINE, null); keysAttributes.put(Chunk.UNDERLINE, null);
@ -330,84 +344,57 @@ public class PdfChunk {
image = null; image = null;
font = PdfFont.getDefaultFont(); font = PdfFont.getDefaultFont();
return pc; return pc;
} } else
else
return null; return null;
} }
HyphenationEvent hyphenationEvent = (HyphenationEvent)noStroke.get(Chunk.HYPHENATION);
int currentPosition = 0; int currentPosition = 0;
int splitPosition = -1; int start = 0;
float currentWidth = indent.getLeft(); float currentWidth = indent.getLeft();
// loop over all the characters of a string // loop over all the characters of a string
// or until the totalWidth is reached // or until the totalWidth is reached
int lastSpace = -1;
float lastSpaceWidth = 0;
int length = value.length(); int length = value.length();
char valueArray[] = value.toCharArray(); char valueArray[] = value.toCharArray();
BreakIterator iterator = BreakIterator.getLineInstance(Locale.getDefault());
BreakIterator iterator1 = new SpaceWithPunctuationBreakIterator(value, iterator);
char character = 0; char character = 0;
boolean surrogate = false; while (currentPosition < length) {
while (currentPosition < length) { int next = iterator1.next();
// the width of every character is added to the currentWidth if(next < 1){
character = valueArray[currentPosition]; break;
// 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);
PdfChunk pc = new PdfChunk(returnValue, this);
return pc;
}
surrogate = Utilities.isSurrogatePair(valueArray, currentPosition);
if (surrogate)
currentWidth += font.width(Utilities.convertToUtf32(valueArray[currentPosition], valueArray[currentPosition + 1]));
else
currentWidth += font.width(character);
if (character == ' ') {
lastSpace = currentPosition + 1;
lastSpaceWidth = currentWidth;
}
if (surrogate)
currentPosition++;
if (currentWidth + indent.getRight()> width)
break;
// if a split-character is encountered, the splitPosition is altered
if (splitCharacter.isSplitCharacter(0, currentPosition, length, valueArray, null))
splitPosition = currentPosition + 1;
currentPosition++;
} }
currentPosition = next - 1;
// 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);
PdfChunk pc = new PdfChunk(returnValue, this);
return pc;
}
String substring = value.substring(start, next);
currentWidth += font.width(substring);
if (currentWidth + indent.getRight() > width){
currentPosition = start - 1;
break;
}
start = next;
}
// if all the characters fit in the total width, null is returned (there is no overflow) // if all the characters fit in the total width, null is returned (there is no overflow)
if (currentPosition == length) { if (currentPosition == length-1) {
return null; return null;
} }
// otherwise, the string has to be truncated // otherwise, the string has to be truncated
if (splitPosition < 0) { String returnValue = value.substring(start);
String returnValue = value; value = trim(value.substring(0, start));
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 >= 0 && 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); PdfChunk pc = new PdfChunk(returnValue, this);
return pc; return pc;
} }
@ -808,7 +795,7 @@ public class PdfChunk {
} }
//todo 需要添加其他样式属性 //todo 需要添加其他样式属性
htmlString.append("<span style='"); htmlString.append("<span style='");
htmlString.append("").append(getStyleAttributes()).append("'"); htmlString.append(getStyleAttributes()).append("'");
htmlString.append(">"); htmlString.append(">");
htmlString.append(value); htmlString.append(value);
htmlString.append("</span>"); htmlString.append("</span>");

34
fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfPCell.java

@ -50,6 +50,7 @@
package com.fr.third.v2.lowagie.text.pdf; package com.fr.third.v2.lowagie.text.pdf;
import java.util.List; import java.util.List;
import java.util.Map;
import com.fr.Container; import com.fr.Container;
import com.fr.third.v2.lowagie.text.Chunk; import com.fr.third.v2.lowagie.text.Chunk;
@ -67,6 +68,36 @@ import com.fr.third.v2.lowagie.text.Phrase;
public class PdfPCell extends Rectangle { public class PdfPCell extends Rectangle {
private float styleWidth = 0.0f;
private float styleHeight = 0.0f;
public float getStyleHeight() {
return styleHeight;
}
public void setStyleHeight(float styleHeight) {
this.styleHeight = styleHeight;
}
public float getStyleWidth() {
return styleWidth;
}
public Map<String, String> background ;
public Map<String, String> getBackground() {
return background;
}
public void setBackground(Map<String, String> background) {
this.background = background;
}
public void setStyleWidth(float styleWidth) {
this.styleWidth = styleWidth;
}
private ColumnText column = new ColumnText(null); private ColumnText column = new ColumnText(null);
/** Vertical alignment of the cell. */ /** Vertical alignment of the cell. */
@ -257,6 +288,9 @@ public class PdfPCell extends Rectangle {
column = ColumnText.duplicate(cell.column); column = ColumnText.duplicate(cell.column);
useBorderPadding = cell.useBorderPadding; useBorderPadding = cell.useBorderPadding;
rotation = cell.rotation; rotation = cell.rotation;
background = cell.background;
styleWidth = cell.styleWidth;
styleHeight = cell.styleHeight;
} }
/** /**

30
fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfPRow.java

@ -76,6 +76,16 @@ public class PdfPRow {
protected float widths[]; protected float widths[];
private float styleHeight;
public float getStyleHeight() {
return styleHeight;
}
public void setStyleHeight(float styleHeight) {
this.styleHeight = styleHeight;
}
/** /**
* extra heights that needs to be added to a cell because of rowspans. * extra heights that needs to be added to a cell because of rowspans.
* @since 2.1.6 * @since 2.1.6
@ -186,31 +196,15 @@ public class PdfPRow {
continue; continue;
} }
else { else {
height = cell.getMaxHeight(); height = cell.getStyleHeight() == 0 ? cell.getContainer().getHeight() : cell.getStyleHeight();
if ((height > maxHeight) && (cell.getRowspan() == 1)) if ((height > maxHeight) && (cell.getRowspan() == 1))
maxHeight = height; maxHeight = height;
} }
} }
calculated = true; calculated = true;
return maxHeight; return maxHeight = Math.max(styleHeight, maxHeight);
} }
public float getMaxHeight2(){
float aMaxHeight = 0.0f;
for (int k = 0; k < cells.length; ++k) {
PdfPCell cell = cells[k];
float height = 0;
if (cell == null) {
continue;
}
else {
height = cell.getContainer().getHeight();
if ((height > aMaxHeight) && (cell.getRowspan() == 1))
aMaxHeight = height;
}
}
return aMaxHeight;
}
/** /**
* Writes the border and background of one cell in the row. * Writes the border and background of one cell in the row.

660
fine-itext/src/com/fr/third/v2/lowagie/text/pdf/PdfPTable.java

File diff suppressed because it is too large Load Diff

52
fine-itext/src/com/fr/third/v2/lowagie/text/pdf/TableProperties.java

@ -0,0 +1,52 @@
package com.fr.third.v2.lowagie.text.pdf;
/**
* 描述table的属性类
* 包括cellspacingcellpaddingborder等
*/
public class TableProperties {
private BorderStyle borderStyle = new BorderStyle();
private float cellspacing = 2.0f;
private float cellpadding = 1.0f;
private boolean collapse = false;
public BorderStyle getBorderStyle() {
return borderStyle;
}
public void setBorderStyle(BorderStyle borderStyle) {
this.borderStyle = borderStyle;
}
public float getCellspacing() {
return cellspacing;
}
public void setCellspacing(float cellspacing) {
this.cellspacing = cellspacing;
}
public float getCellpadding() {
return cellpadding;
}
public void setCellpadding(float cellpadding) {
this.cellpadding = cellpadding;
}
public boolean isCollapse() {
return collapse;
}
public void setCollapse(boolean collapse) {
this.collapse = collapse;
}
public String toHtmlString(){
StringBuffer sb = new StringBuffer();
sb.append("cellspacing").append("=").append(cellspacing).append(" ");
sb.append("cellpadding").append("=").append(cellpadding).append(" ");
sb.append("border").append("=").append(borderStyle.getBorderWidth()).append(" ");
return sb.toString();
}
}
Loading…
Cancel
Save