我有一个使用 iText 生成的 pdf 报告,其中包含添加到 MultiColumnText 的 PdfPTable,有时会变得如此之大,以至于它会被拆分为多个页面。
目前 MultiColumnText 已被分为两列,MultiColumnText 垂直填充 PdfPTable 就像:
第 1 页
+--+--+
|T1|T5|
+--+--+
|T2|T6|
+--+--+
|T3|T7|
+--+--+
|T4|T8|
+--+--+
第 2 页
+---+---+
|T9 |T13|
+---+---+
|T10|T14|
+---+---+
|T11|T15|
+---+---+
|T12|T16|
+---+---+
....我想做这个:
第 1 页
+--+--+
|T1|T2|
+--+--+
|T3|T4|
+--+--+
|T5|T6|
+--+--+
|T7|T8|
+--+--+
第 2 页
+---+---+
|T9 |T10|
+---+---+
|T11|T12|
+---+---+
|T13|T14|
+---+---+
|T15|T16|
+---+---+
代码是:
/**
* Initializes the fonts and collections.
* Creates a PDF document.
*
* @param from as a Date
* @param to as a Date
* @param weeklyComplianceMap as a Map for print weekly compliance
* @param monthlyComplianceMap as a Map for print monthly compliance
* @param calLogList as a List for calculate the add event
* @param locale Locale in case you want to create a Calendar in another language
* @throws DocumentException, IOException, ParseException
* @return ByteArrayOutputStream of PDF output
*/
public ByteArrayOutputStream createPdf(Date from, Date to, Map<String, Integer> weeklyComplianceMap,
Map<String, Double> monthlyComplianceMap, List<InjectionLogInfo> calLogList, Locale locale)
throws DocumentException, ParseException, IOException {
calendar = new GregorianCalendar();
calendar.setTime(from);
BaseFont bf_normal = BaseFont.createFont(
"C:/Windows/Fonts/arial.ttf", BaseFont.WINANSI,
BaseFont.EMBEDDED);
small = new Font(bf_normal, 8);
normal = new Font(bf_normal, 11);
BaseFont bf_bold = BaseFont.createFont(
"C:/Windows/Fonts/arialbd.ttf", BaseFont.WINANSI,
BaseFont.EMBEDDED);
smallBold = new Font(bf_bold, 10);
normalBold = new Font(bf_bold, 12);
bigBold = new Font(bf_bold, 14);
document = new Document(PageSize.A4, 20, 20, 40, 30);
baos = new ByteArrayOutputStream();
writer = PdfWriter.getInstance(document, baos);
ResourceBundle rb = ResourceBundle.getBundle("com.resources.messages", locale);
Paragraph hText = new Paragraph(rb.getString("lbl.calendar.view"), bigBold);
hText.setAlignment(Element.ALIGN_CENTER);
Chunk c1 = new Chunk(rb.getString("lbl.document.generated") + " ", normal);
Chunk c2 = new Chunk(fdf.format(new Date()), normal);
Chunk c3 = new Chunk(" " + rb.getString("lbl.at") + " ", normal);
Chunk c4 = new Chunk(tdf.format(new Date()), normal);
Chunk c5 = new Chunk(new VerticalPositionMark(), 500f, false);
Chunk c6 = new Chunk(rb.getString("lbl.page") + " ", normal);
Phrase fText = new Phrase();
fText.add(c1);fText.add(c2);fText.add(c3);
fText.add(c4);fText.add(c5);fText.add(c6);
HeaderFooter header = new HeaderFooter(hText, false);
HeaderFooter footer = new HeaderFooter(fText, true);
document.setHeader(header);
document.setFooter(footer);
document.open();
document.leftMargin();
mct = new MultiColumnText();
mct.addRegularColumns(document.left(), document.right(), 20, 2);
mct.setRunDirection(PdfWriter.RUN_DIRECTION_LTR);
for (int month = 0; month < monthsBetween(from, to, Calendar.MONTH); month++) {
// create a table with 8 columns
float[] colsWidth = {35f, 35f, 35f, 35f, 35f, 35f, 35f, 50f};
table = new PdfPTable(colsWidth);
table.setWidthPercentage(100);
// add the name of the month
table.getDefaultCell().setBackgroundColor(Color.WHITE);
table.addCell(getMonthCell(calendar, locale));
Double monAdh = monthlyComplianceMap.get(mdf.format(calendar.getTime()));
table.addCell(getMonthlyAdherence(monAdherence));
// add the name of the days
String[] days = getDayNames();
for (String day : days) {
table.addCell(getDayNamesCell(day, locale));
}
int day = 1;
int position = 2;
int dayofWeek = calendar.get(Calendar.DAY_OF_WEEK);
int daysinMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
// add empty cells
int rc = 0;
while (position != dayofWeek) {
rc++;
position = (position % 7) + 1;
table.addCell("");
}
// add cells for each day
while (day <= daysinMonth) {
calendar = new GregorianCalendar(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), day++);
table.addCell(getDayCell(calLogList, calendar, locale));
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
rc++;
String week = (calendar.get(Calendar.WEEK_OF_YEAR)-1) + ", " + calendar.get(Calendar.YEAR);
if (null != weeklyComplianceMap) {
wa = weeklyComplianceMap.get(week);
table.addCell(getDayAdherenceCell(weekAdherence));
} else {
String weekAdherence = "0%";
table.addCell(getDayAdherenceCell(weekAdherence));
}
}
}
if (9 < rc)
table.setSpacingAfter(20);
else
table.setSpacingAfter(40);
// complete the table
table.completeRow();
// add the table to MultiColumnText object
mct.addElement(table);
// increment the day by 1
calendar.add(Calendar.DATE, 1);
}
document.add(mct);
document.newPage();
document.close();
return baos;
}
/**
* Creates a PdfPCell with the name of the month
*
* @param calendar a date
* @param locale a locale
* @return a PdfPCell with rowspan 7, containing the name of the month
*/
public PdfPCell getMonthCell(Calendar calendar, Locale locale) {
PdfPCell cell = new PdfPCell();
cell.setColspan(7);
cell.setMinimumHeight(30);
cell.setBackgroundColor(Color.GRAY);
Paragraph p = new Paragraph(String.format(locale, "%1$tB %1$tY", calendar), normalBold);
p.setAlignment(Element.ALIGN_LEFT);
cell.addElement(p);
return cell;
}
/**
* Creates a PdfPCell for a month
*
* @param string adherence of a month
* @return a PdfPCell
*/
private PdfPCell getMonthlyAdherence(String adherence) {
PdfPCell cell = new PdfPCell();
cell.setMinimumHeight(35);
//cell.setBorderColorLeft(Color.GRAY);
cell.setBackgroundColor(Color.GRAY);
Paragraph p = new Paragraph(adherence, smallBold);
p.setAlignment(Element.ALIGN_RIGHT);
cell.addElement(p);
return cell;
}
/**
* Creates a PdfPCell with the name of the day
*
* @param day name of a day
* @param locale a locale
* @return a PdfPCell, containing the name of the day
*/
public PdfPCell getDayNamesCell(String day, Locale locale) {
PdfPCell cell = new PdfPCell();
cell.setPadding(3);
cell.setBackgroundColor(Color.LIGHT_GRAY);
Paragraph p = new Paragraph(day, smallBold);
p.setAlignment(Element.ALIGN_CENTER);
cell.addElement(p);
return cell;
}
/**
* Creates a PdfPCell for a specific day
*
* @param calendar a date
* @param locale a locale
* @return a PdfPCell
*/
public PdfPCell getDayCell(List<InjectionLogInfo> calLogList, Calendar calendar, Locale locale) {
PdfPCell cell = new PdfPCell();
cell.setPadding(3);
// set the content in the language of the locale
Chunk chunk = new Chunk(String.format(locale, "%1$te", calendar), small);
// a paragraph with the day
Paragraph p = new Paragraph(chunk);
p.setAlignment(Element.ALIGN_CENTER);
cell.addElement(p);
return cell;
}
/**
* Creates a PdfPCell for a week
*
* @param string adherence of a week
* @return a PdfPCell
*/
public PdfPCell getDayAdherenceCell(String adherence) {
PdfPCell cell = new PdfPCell();
cell.setPadding(3);
// set the adherence for each week
Chunk chunk = new Chunk(adherence, small);
// a paragraph with the adherence
Paragraph p = new Paragraph(chunk);
p.setAlignment(Element.ALIGN_CENTER);
cell.addElement(p);
return cell;
}
/**
* Retrieves a Day Names for a single week
*
* @return a String array of day names
*/
public String[] getDayNames() {
DateFormatSymbols symbols = new DateFormatSymbols();
String[] dayNames = symbols.getShortWeekdays();
List<String> stringList = new ArrayList<String>();
for (String string : dayNames) {
if (string != null && string.length() > 0) {
stringList.add(string);
}
}
if (stringList.size() > 0) {
String one = stringList.get(0);
stringList.remove(0);
stringList.add(one);
stringList.add("%");
}
dayNames = stringList.toArray(new String[stringList.size()]);
return dayNames;
}
我坚持这一点,所以非常感谢任何帮助。
谢谢。