From 271f249c0ff24b593bcc83c86edfeb236a551be5 Mon Sep 17 00:00:00 2001 From: Andreas Fitzek Date: Mon, 6 Oct 2014 11:48:51 +0200 Subject: Colum span handling corrected. #38 --- .../egiz/pdfas/lib/impl/stamping/TableFactory.java | 10 +-- .../lib/impl/stamping/pdfbox/PDFBoxTable.java | 4 +- .../lib/impl/stamping/pdfbox/TableDrawUtils.java | 28 ++++++-- .../at/knowcenter/wag/egov/egiz/table/Table.java | 78 ++++++++++++++++++++-- 4 files changed, 102 insertions(+), 18 deletions(-) (limited to 'pdf-as-lib/src/main') diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/TableFactory.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/TableFactory.java index 838d9d5a..939c2b3a 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/TableFactory.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/TableFactory.java @@ -34,6 +34,7 @@ import java.util.Vector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import at.gv.egiz.pdfas.common.exceptions.PdfAsSettingsException; import at.gv.egiz.pdfas.common.settings.IProfileConstants; import at.gv.egiz.pdfas.common.settings.ISettings; import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; @@ -97,12 +98,13 @@ public class TableFactory implements IProfileConstants { * @param tableID * is the name of the table definition in the settings file * @return a new abstract signature table + * @throws PdfAsSettingsException * @see at.knowcenter.wag.egov.egiz.table.Style * @see at.knowcenter.wag.egov.egiz.table.Table * @see at.knowcenter.wag.egov.egiz.table.Entry */ public static Table createSigTable(SignatureProfileSettings profile, String tableID, OperationStatus operationStatus, - ICertificateProvider certProvider) + ICertificateProvider certProvider) throws PdfAsSettingsException { String table_key_prefix = SIG_OBJ + profile.getProfileID() + "." + TABLE; String table_key = table_key_prefix + tableID; @@ -198,7 +200,7 @@ public class TableFactory implements IProfileConstants { resolver.resolve(key, value, profile), key); if (entry != null) { - //entry.setColSpan(2); + entry.setColSpan(2); entry.setStyle(defaultValueStyle_); row.add(entry); } @@ -212,7 +214,7 @@ public class TableFactory implements IProfileConstants { resolver.resolve(key, value, profile), key); if (entry != null) { - //entry.setColSpan(2); + entry.setColSpan(2); entry.setStyle(defaultCaptionStyle_); row.add(entry); } @@ -260,7 +262,7 @@ public class TableFactory implements IProfileConstants { sig_table.addRow(table_def, row); } } - + sig_table.normalize(); return sig_table; } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java index 38a883fe..e84bd498 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFBoxTable.java @@ -197,9 +197,9 @@ public class PDFBoxTable { for (int j = 0; j < row.size(); j++) { Entry cell = (Entry) row.get(j); - float colWidth = colWidths[j]; + float colWidth = 0;//colWidths[j]; - int colsleft = cell.getColSpan() - 1; + int colsleft = cell.getColSpan(); if (j + colsleft > colWidths.length) { throw new IOException( diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/TableDrawUtils.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/TableDrawUtils.java index bc21c266..88eb798a 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/TableDrawUtils.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/TableDrawUtils.java @@ -93,23 +93,36 @@ public class TableDrawUtils { Style inherit_style = Style.doInherit(abstractTable.style, cell.getStyle()); cell.setStyle(inherit_style); + float colWidth = 0;//colWidths[j]; + + int colsleft = cell.getColSpan(); + + if (j + colsleft > colsSizes.length) { + throw new PdfAsException( + "Configuration is wrong. Cannot determine column width!"); + } + + for (int k = 0; k < colsleft; k++) { + colWidth = colWidth + colsSizes[j + k]; + } + drawDebugPadding(contentStream, contentx, contenty, padding, - colsSizes[j], abstractTable.getRowHeights()[i], settings); + colWidth, abstractTable.getRowHeights()[i], settings); switch (cell.getType()) { case Entry.TYPE_CAPTION: drawCaption(page, contentStream, contentx, contenty, - colsSizes[j], abstractTable.getRowHeights()[i], + colWidth, abstractTable.getRowHeights()[i], padding, abstractTable, doc, cell, formResources, settings); break; case Entry.TYPE_VALUE: drawValue(page, contentStream, contentx, contenty, - colsSizes[j], abstractTable.getRowHeights()[i], + colWidth, abstractTable.getRowHeights()[i], padding, abstractTable, doc, cell, formResources, settings); break; case Entry.TYPE_IMAGE: drawImage(page, contentStream, contentx, contenty, - colsSizes[j], abstractTable.getRowHeights()[i], + colWidth, abstractTable.getRowHeights()[i], padding, abstractTable, doc, cell, formResources, images, settings); break; @@ -122,7 +135,7 @@ public class TableDrawUtils { tbl_value.table.setStyle(inherit_styletab); drawTable(page, contentStream, contentx, contenty - - abstractTable.getRowHeights()[i], colsSizes[j], + - abstractTable.getRowHeights()[i], colWidth, abstractTable.getRowHeights()[i], tbl_value, doc, true, formResources, images, settings); break; @@ -132,7 +145,10 @@ public class TableDrawUtils { } // Move content pointer - contentx += colsSizes[j]; + contentx += colWidth; + + int span = cell.getColSpan() - 1; + j += span; } // Move content pointer diff --git a/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/table/Table.java b/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/table/Table.java index 6db7ff3a..12d0e2ee 100644 --- a/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/table/Table.java +++ b/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/table/Table.java @@ -49,9 +49,12 @@ package at.knowcenter.wag.egov.egiz.table; import java.io.Serializable; -import java.util.Map; -import java.util.HashMap; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import at.gv.egiz.pdfas.common.exceptions.PdfAsSettingsException; /** * This class implements an abstract table definition. The table contains table @@ -216,12 +219,75 @@ public class Table implements Serializable public void addRow(String rowNumber, ArrayList row) { rows_.put(rowNumber, row); - if (row.size() > maxCols_) - { - maxCols_ = row.size(); - } + calculateMaxCols(row); } + private void calculateMaxCols(ArrayList newrow) { + int colCount = calculateRowSize(newrow); + if (colCount > maxCols_) + { + maxCols_ = colCount; + } + } + + private int calculateRowSize(ArrayList newrow) { + int colCount = 0; + for(int i = 0; i < newrow.size(); i++) { + colCount += newrow.get(i).getColSpan(); + } + return colCount; + } + + private void recalculateMaxCol() { + Iterator> rowIt = getRows().iterator(); + while(rowIt.hasNext()) { + ArrayList row = rowIt.next(); + calculateMaxCols(row); + } + } + + private boolean recursiveNorm = false; + + /** + * Expands the last cell of each column to fill the table + * @throws PdfAsSettingsException + */ + public void normalize() throws PdfAsSettingsException { + Iterator> rowIt = getRows().iterator(); + while(rowIt.hasNext()) { + ArrayList row = rowIt.next(); + + // This row fits just fine + if(row.size() == maxCols_) { + continue; + } + + int rowSize = calculateRowSize(row); + + // This row fits just fine including row spans + if(rowSize == maxCols_) { + continue; + } + + int missingColumns = maxCols_ - rowSize; + + if(missingColumns < 0) { + // wrong max Col value! + // recalculate the maximum Columns and normalize again! + if(recursiveNorm) { + throw new PdfAsSettingsException("Failed to build virtual model of signatur block table."); + } + recalculateMaxCol(); + recursiveNorm = true; + normalize(); + recursiveNorm = false; + break; + } else { + row.get(row.size() - 1).setColSpan(row.get(row.size() - 1).getColSpan() + missingColumns); + } + } + } + /** * The toString method, used for tests or debugging. */ -- cgit v1.2.3