java - 仅部分生成表

标签 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 个页眉行和 1 个页脚行(#setHeaderRows(int) 负责设置页眉行数,#setFooterRows(int) 负责确定有多少页眉行实际上是页脚行):

table.setHeaderRows(3);
table.setFooterRows (1);

因此,如果添加 3 行,则没有实际的正文内容(只有页眉和页脚行)。因此你的 result-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();

您将看到包含“string 54”和“string 53”单元格的行在每页上重复(作为标题)。对于具有“字符串 52”单元格的行(作为页脚)也是如此。

据我了解,您无意保留页眉和页脚行。只需删除上面提到的行即可解决您的问题。

关于java - 仅部分生成表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45735719/

相关文章:

java - Flying Saucer (xhtmlrenderer) 没有加粗我的字体?

java - iText Java 签名 PDF DocumentException : Not enough space

java - 如何确定 Java 8 元空间的理想大小

Java 程序输出(堆栈)

java - 如何在 iText 7 中设置横向方向

java - 如何使用pdfbox解析包含表格格式数据的pdf

java - Android iText PDF 创建

java - 如何修复 WARNING : use of system property netbeans. home has been obsoted

java - 如何静默下载 Google Play 游戏服务保存的游戏快照数据?

javascript - 在 vaadin 8 中将文本复制到剪贴板