diff --git a/fine-itext/src/com/fr/third/v2/lowagie/text/html/Markup.java b/fine-itext/src/com/fr/third/v2/lowagie/text/html/Markup.java index 763bbde5a..6a9cc97ff 100644 --- a/fine-itext/src/com/fr/third/v2/lowagie/text/html/Markup.java +++ b/fine-itext/src/com/fr/third/v2/lowagie/text/html/Markup.java @@ -209,6 +209,8 @@ public class Markup { /** the CSS tag for the visibility of objects */ public static final String CSS_KEY_VISIBILITY = "visibility"; + public static final String CSS_KEY_TEXTINDENT = "text-indent"; + // CSS values /** @@ -341,7 +343,7 @@ public class Markup { /** * New method contributed by: Lubos Strapko - * + * * @since 2.1.3 */ public static float parseLength(String string, float actualFontSize) { diff --git a/fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/FactoryProperties.java b/fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/FactoryProperties.java index 418bb954f..cf53266c4 100644 --- a/fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/FactoryProperties.java +++ b/fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/FactoryProperties.java @@ -374,14 +374,7 @@ public class FactoryProperties { if (key.equals(Markup.CSS_KEY_FONTFAMILY)) { h.put(ElementTags.FACE, prop.getProperty(key)); } else if (key.equals(Markup.CSS_KEY_FONTSIZE)) { - float actualFontSize = Markup.parseLength(cprops - .getProperty(ElementTags.SIZE), - Markup.DEFAULT_FONT_SIZE); - if (actualFontSize <= 0f) - actualFontSize = Markup.DEFAULT_FONT_SIZE; - h.put(ElementTags.SIZE, Float.toString(Markup.parseLength(prop - .getProperty(key), actualFontSize)) - + "pt"); + dealWithFontSizeOrTextIndent(h, cprops, prop, key); } else if (key.equals(Markup.CSS_KEY_FONTSTYLE)) { String ss = prop.getProperty(key).trim().toLowerCase(); if (ss.equals("italic") || ss.equals("oblique")) @@ -429,14 +422,34 @@ public class FactoryProperties { } else if (key.equals(Markup.CSS_KEY_BGCOLOR)) { String ss = prop.getProperty(key).trim().toLowerCase(); h.put("background", ss); - } - else{ - String ss = prop.getProperty(key).trim(); - h.put(key, ss); - } + } else if (key.equals(Markup.CSS_KEY_TEXTINDENT)) { + dealWithFontSizeOrTextIndent(h, cprops, prop, key); + } else { + String ss = prop.getProperty(key).trim(); + h.put(key, ss); + } } } + /** + * 处理下字号和文本缩进 + * + * @param h 当前标签内的属性Map + * @param cprops 一个list , 从左到右保存着父到子标签中的属性 + * @param prop 当前标签内的style 属性Map + * @param key 当前 prop 中的 k + */ + private static void dealWithFontSizeOrTextIndent(HashMap h, ChainedProperties cprops, Properties prop, String key) { + float actualFontSize = Markup.parseLength(cprops + .getProperty(ElementTags.SIZE), + Markup.DEFAULT_FONT_SIZE); + if (actualFontSize <= 0f) + actualFontSize = Markup.DEFAULT_FONT_SIZE; + h.put(key.equals(Markup.CSS_KEY_FONTSIZE) ? ElementTags.SIZE : key, Float.toString(Markup.parseLength(prop + .getProperty(key), actualFontSize)) + + "pt"); + } + public FontFactoryImp getFontImp() { return fontImp; } diff --git a/fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/IncTable.java b/fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/IncTable.java index c971540a1..5da1eb4ca 100644 --- a/fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/IncTable.java +++ b/fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/IncTable.java @@ -68,6 +68,7 @@ public class IncTable { private ArrayList cols; private ArrayList rowHeights = new ArrayList(); + private ArrayList relativeColWidths = new ArrayList(); /** Creates a new instance of IncTable */ public IncTable(HashMap props) { this.props.putAll(props); @@ -103,33 +104,30 @@ public class IncTable { if (rows.isEmpty()) return new PdfPTable(1); int ncol = 0; - ArrayList c0 = (ArrayList)rows.get(0); - ArrayList colWidths = new ArrayList(); - float widthSum = 0; + ArrayList c0 = (ArrayList) rows.get(0); + for (int k = 0; k < c0.size(); ++k) { - PdfPCell pCell = ((PdfPCell)c0.get(k)); - int cellCols = pCell.getColspan(); - ncol += cellCols; - //不取 0 ,后面可能需要求比值 - float styleWidth = pCell.getStyleWidth(); - if(cellCols > 1){ - float avgWidth = styleWidth / cellCols; - float width = 0 == avgWidth ? 1 : avgWidth; - widthSum = width * cellCols; - for(int a = 0; a < cellCols ; a++){ - colWidths.add(width); - } - }else { - float width = 0 == styleWidth ? 1 : styleWidth; - widthSum += width; - colWidths.add(width); - } + ncol += ((PdfPCell) c0.get(k)).getColspan(); } + processColWidth(ncol); + PdfPTable table = new PdfPTable(ncol); try { TableProperties tableProperties = parseTableProperties(); table.setTableProperties(tableProperties); + + //相对宽度 + float[] floats = new float[relativeColWidths.size()]; + for (int a = 0; a < relativeColWidths.size(); a++) { + floats[a] = relativeColWidths.get(a); + } + try { + table.setWidths(floats); + } catch (Exception e) { + e.printStackTrace(); + } + String width = (String)props.get("width"); if (width == null) table.setWidthPercentage(100); @@ -138,18 +136,7 @@ public class IncTable { 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] = totalWidth * colWidths.get(a) / widthSum; - } - //解析px数值 - table.setTotalWidth(totalWidth); - try { - table.setWidths(floats); - }catch (Exception e){ - e.printStackTrace(); - } + table.setTotalWidth(CSSUtils.parseFloat(width)); table.setLockedWidth(true); } } @@ -161,14 +148,61 @@ public class IncTable { } processRowHeight(table); - - }catch (Exception e){ e.printStackTrace(); } return table; } + /** + * 调整列宽,每列取最大值 + * + * @param colCount 列数 + */ + private void processColWidth(int colCount) { + if (null == rows || 0 == rows.size()) { + return; + } + //初始化一下 + for (int i = 0; i < colCount; i++) { + relativeColWidths.add(0f); + } + for (int rowIndex = 0; rowIndex < rows.size(); rowIndex++) { + ArrayList cols = (ArrayList) rows.get(rowIndex); + for (int colIndex = 0; colIndex < cols.size(); colIndex++) { + PdfPCell pCell = ((PdfPCell) cols.get(colIndex)); + + int cellCols = pCell.getColspan(); + float avgWidth = pCell.getStyleWidth() / cellCols; + for (int i = 0; i < cellCols && colIndex + i < colCount; i++) { + if (relativeColWidths.get(colIndex + i) < avgWidth) { + relativeColWidths.set(colIndex + i, avgWidth); + } + } + } + } + dealRelativeColWidthsWhenAllAreZero(relativeColWidths); + } + + /** + * 全部为0,则全部赋值1 + * + * @param relativeColWidths 相对宽度 + */ + private void dealRelativeColWidthsWhenAllAreZero(ArrayList relativeColWidths) { + if (0 == relativeColWidths.size()) { + return; + } + for (int i = 0; i < relativeColWidths.size(); i++) { + if (0 != relativeColWidths.get(i)) { + return; + } + } + for (int i = 0; i < relativeColWidths.size(); i++) { + relativeColWidths.set(i, 1f); + } + } + public void processRowHeight(PdfPTable table) { Float height = CSSUtils.parseFloat((String) props.get("height")); Float eachHeight = height / table.getRows().size();