表仅部分生成

时间:2017-08-17 12:55:31

标签: java itext

我使用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";
        }


    }
}

2 个答案:

答案 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

上的文档