我使用iText5库生成pdf文档 我正在尝试在pdf文件中创建一个表 当表行数大于3时,它可以正常工作 但是当表行数小于3时,它会生成一个没有表的空pdf文件(只打印标题。)
这是我的代码:
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.GrayColor;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.swing.JOptionPane;
//import sandbox.WrapToTest;
//@WrapToTest
public class ColumnWidthExample {
static String f="";
public static final String DEST = "C:\\Users\\Rahul\\Documents\\Challan_Reports\\";
// public static void main(String[] args) throws IOException, DocumentException {
// ColumnWidthExample.createPdf("2017-08-08","anuj");
// }
public static String createPdf(String dest,String gname) throws IOException, DocumentException {
try{
// for (int counter = 1; counter < 101; counter++) {
// table.addCell(String.valueOf(counter));
// table.addCell("key " + counter);
// table.addCell("value " + counter);
// }
Connection con=DB.getConnection();
PreparedStatement ps=con.prepareStatement("select * from echallan where guarantor_name='"+gname+"' and date='"+dest+"' order by date desc");
ResultSet rs=ps.executeQuery();
if(rs.next())
{ JOptionPane.showMessageDialog(null, "exists");
System.out.println(dest+gname+" cpdf");
File file = new File(DEST+" "+dest+" "+gname+".pdf");
file.getParentFile().mkdirs();
Document document = new Document(PageSize.A4.rotate());
PdfWriter.getInstance(document, new FileOutputStream(DEST+""+dest+"_"+gname+".pdf"));
f=DEST+" "+dest+" "+gname+".pdf";
document.open();
document.add(new Chunk(""));
document.add(new Paragraph(" Report of Guarantor "+gname+" for date "+dest));
document.add(new Paragraph(""));
float[] columnWidths = {10, 10, 10,5,5,10,10,5,7,5,10,10,13,10,10};
PdfPTable table = new PdfPTable(columnWidths);
table.setWidthPercentage(105);
table.getDefaultCell().setUseAscender(true);
table.getDefaultCell().setUseDescender(true);
Font f = new Font(FontFamily.HELVETICA, 10, Font.NORMAL, GrayColor.GRAYWHITE);
PdfPCell cell = new PdfPCell(new Phrase());
table.getDefaultCell().setBackgroundColor(new GrayColor(0.75f));
table.addCell("Merchant\ncode");
table.addCell("Merchant\nname");
table.addCell("Invioce");
table.addCell("Bale\nfrom");
table.addCell("Bale\nto");
table.addCell("Total\nbale");
table.addCell("Station");
table.addCell("Sort");
table.addCell("Chart");
table.addCell("Ex\nmill");
table.addCell("Rransport");
table.addCell("Remarks");
table.addCell("Date");
table.addCell("Guarantor\nname");
table.addCell("Guarantor\ncode");
table.setHeaderRows(3);
table.setFooterRows(1);
table.getDefaultCell().setBackgroundColor(GrayColor.GRAYWHITE);
table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
cell = new PdfPCell(new Phrase());
do{
for(int i=1;i<=15;i++){
table.addCell(""+rs.getString(i));
JOptionPane.showMessageDialog(null, rs.getString(i));}
document.add(new Phrase());
}while(rs.next());
document.add(table);
document.close();
return "Generated successfully.\n File Saved in \n "+DEST+dest+"_"+gname;
}
else
{
return "No data found";
}
}
catch(Exception e)
{
System.out.print(e);
return "unsuccessfull";
}
}
}
答案 0 :(得分:3)
问题与页眉/页脚行有关。
在接下来的行中设置2个页眉和1个页脚行(#setHeaderRows(int)负责设置标题行的数量,#setFooterRows(int)负责识别有多少标题行实际是页脚行):
table.setHeaderRows(3);
table.setFooterRows (1);
因此,如果添加3行,则没有实际的正文内容(您只有页眉和页脚行)。因此,您的结果-pdf为空。
如果您运行下一个代码段
float[] columnWidths = {10, 10, 10,5,5,10,10,5,7,5,10,10,13,10,10};
PdfPTable table = new PdfPTable(columnWidths);
table.setHeaderRows(3);
table.setFooterRows(1);
int j = 55;
do{
j--;
for(int i=1;i<=15;i++){
table.addCell("string " + j);
}
document.add(new Phrase());
} while(j >0);
document.add(table);
document.close();
你会看到&#34;字符串54&#34;和&#34;字符串53&#34;单元重复每页(作为标题)。具有&#34;字符串52&#34;的行相同细胞(作为页脚)。
据我了解,您无需保留页眉和页脚行。只需删除上面提到的行就可以解决您的问题。
答案 1 :(得分:0)
我很确定iText会生成表,而不管你扔到表中的行数。
追踪问题的可能方法: - iText(默认情况下)不插入部分填充的行。如果您有一个包含5列的表,并且只插入4个单元格,则只会看到标题。
此外,如果您可以自由选择可以使用的iText版本,请使用iText7。很多错误修正,特别是与表格有关。
另外,请查看http://developers.itextpdf.com/content/itext-7-examples/itext-7-tables
上的文档