Java PDF中table的生成和使用

作者: UNK_8adb | 来源:发表于2019-05-12 18:17 被阅读0次

    下列例子基于itextpdf-5.5.13.jar

    为以下问题提供了解决方法:

    Unit1:
    1. 如何生成带一个表格的PDF?
    2. 如何生成带多个表格的PDF?
    Unit2:
    1. 如何生成带简单表格(多行多列)的PDF?
    2. 如何生成带复杂表格(跨列/跨行)的PDF?
    Unit3:
    1. 如何使用内部字体文件?
    2. 如何使用外部字体文件?
    Unit1-1:如何生成带一个表格的PDF?
    SimpleTable.png
    
    import java.io.File;
    import java.io.FileOutputStream;
    
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.pdf.PdfPTable;
    import com.itextpdf.text.pdf.PdfWriter;
    
    public class SimpleTable {
        public static final String DEST = "results/tables/simple_table1.pdf";
    
        public static void main(String[] args) throws DocumentException, Exception {
            File file = new File(DEST);
            file.getParentFile().mkdirs();
            SimpleTable.createPDF(DEST);
        }
    
        public static void createPDF(String dest) throws Exception, DocumentException {
            Document document = new Document();
            PdfWriter.getInstance(document, new FileOutputStream(dest));
            document.open();
            
            //生成一个2行4列的表格,各列的宽度比为1:2:1:2
            PdfPTable table = new PdfPTable(4);
            table.setWidths(new int[] { 1, 2, 1, 2 });
            table.addCell("1line A");
            table.addCell("1line B");
            table.addCell("1line C");
            table.addCell("1line D");
    
            table.addCell("2line A");
            table.addCell("2line B");
            table.addCell("2line C");
            table.addCell("2line D");
            document.add(table);
            document.close();
            System.out.println(DEST + "生成成功");
        }
    
    }
    
    Unit1-2:如何生成带多个表格的PDF?
    SimpleTable2.png

    1. 在创建第二个table之前,新加 document.add(new Phrase("\n"));
    2. 开始创建新的table:table=new PdfTable(colnum);

    import java.io.File;
    import java.io.FileOutputStream;
    
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.Phrase;
    import com.itextpdf.text.pdf.PdfPTable;
    import com.itextpdf.text.pdf.PdfWriter;
    
    public class SimpleTable {
        public static final String DEST = "results/tables/simple_table2.pdf";
    
        public static void main(String[] args) throws DocumentException, Exception {
            File file = new File(DEST);
            file.getParentFile().mkdirs();
            SimpleTable.createPDF(DEST);
        }
    
        public static void createPDF(String dest) throws Exception, DocumentException {
            Document document = new Document();
            PdfWriter.getInstance(document, new FileOutputStream(dest));
            document.open();
    
            // 生成一个2行4列的表格,4列的长度比为1:2:1:2
            PdfPTable table = new PdfPTable(4);
            table.setWidths(new int[] { 1, 2, 1, 2 });
            table.addCell("1line A");
            table.addCell("1line B");
            table.addCell("1line C");
            table.addCell("1line D");
    
            table.addCell("2line A");
            table.addCell("2line B");
            table.addCell("2line C");
            table.addCell("2line D");
            document.add(table);
    
            // 用换行符进行表格分割
            document.add(new Phrase("\n"));
    
            // 创建第二个表格
            table = new PdfPTable(4);
            // 下列代码与建立第一个表格的代码重复
            table.setWidths(new int[] { 1, 2, 1, 2 });
            table.addCell("1line A");
            table.addCell("1line B");
            table.addCell("1line C");
            table.addCell("1line D");
    
            table.addCell("2line A");
            table.addCell("2line B");
            table.addCell("2line C");
            table.addCell("2line D");
            document.add(table);
    
            document.close();
            System.out.println(DEST + "生成成功");
    
        }
    
    }
    
    Unit2-1:如何生成带简单表格(多行多列)PDF?

    该问题与Unit1-1相似,不同的是考虑了存在列表数据比较多的情况,用了linkedHashMap进行存值。

    table1.png
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.pdf.PdfPTable;
    import com.itextpdf.text.pdf.PdfWriter;
    
    public class LinkedHashMapTable {
        public static final String DEST = "results/tables/table.pdf";
    
        public static void main(String[] args) throws DocumentException, Exception {
            File file = new File(DEST);
            file.getParentFile().mkdirs();
            LinkedHashMapTable.createPDF(DEST);
        }
    
        public static void createPDF(String dest) throws Exception, DocumentException {
            Document document = new Document();
            PdfWriter.getInstance(document, new FileOutputStream(dest));
            document.open();
    
            PdfPTable table = new PdfPTable(4);
            table.setWidths(new int[] { 1, 2, 1, 2 });
            // 通过有序的LinkedHashMap进行key-value存值
            Map<String, String> map = new LinkedHashMap<String, String>();
            map.put("1Line A", "1Line B");
            map.put("1Line C", "1Line D");
            map.put("2Line A", "2Line B");
            map.put("2Line C", "2Line D");
            // 通过Map.entrySet遍历key和value
            for (Map.Entry<String, String> entry : map.entrySet()) {
                table.addCell(entry.getKey());
                table.addCell(entry.getValue());
            }
    
            document.add(table);
            document.close();
    
            System.out.println(DEST + "生成成功");
    
        }
    }
    
    Unit2-2:如何生成带复杂表格(多行多列)PDF?
    row_col.png
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    import com.itextpdf.text.BaseColor;
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.Phrase;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.PdfPCell;
    import com.itextpdf.text.pdf.PdfPTable;
    import com.itextpdf.text.pdf.PdfWriter;
    
    public class RowColspan {
        public static final String DEST = "results/tables/rowspan_colspan11.pdf";
        public static final String FONT = "C:/Windows/Fonts/msyh.ttc,0";
    
        public static void main(String[] args) throws DocumentException, Exception {
            File file = new File(DEST);
            file.getParentFile().mkdirs();
            RowColspan.createPDF(DEST);
        }
    
        public static void createPDF(String dest) throws DocumentException, Exception {
            Document document = new Document();
            PdfWriter.getInstance(document, new FileOutputStream(dest));
            document.open();
            BaseFont unicode = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            Font font = new Font(unicode, 12, Font.NORMAL, new BaseColor(50, 205, 50));
            PdfPTable table = new PdfPTable(4);
            table.setWidths(new int[] { 1, 2, 1, 2 });
            PdfPCell cell;
            cell = new PdfPCell(new Phrase("基本信息", font));
            // 跨四列,由四列变成一列
            cell.setColspan(4);
            table.addCell(cell);
    
            // 由四列变成两列
            cell = new PdfPCell(new Phrase("A"));
            table.addCell(cell);
            cell = new PdfPCell(new Phrase("B"));
            cell.setColspan(3);
            table.addCell(cell);
    
            // 为了使代码简洁,接下来的存值进行遍历
            Map<String, String> map = new LinkedHashMap<String, String>();
            map.put("C", "D");
            map.put("E", "F");
            map.put("G", "H");
            map.put("I", "J");
            map.put("K", "L");
            for (Map.Entry<String, String> entry : map.entrySet()) {
                cell = new PdfPCell(new Phrase(entry.getKey()));
                table.addCell(cell);
                cell = new PdfPCell(new Phrase(entry.getValue()));
                cell.setColspan(3);
                table.addCell(cell);
            }
    
            // 正常四列
            table.addCell(new Phrase("第一列", font));
            table.addCell(new Phrase("第二列", font));
            table.addCell(new Phrase("第三列", font));
            table.addCell(new Phrase("第四列", font));
    
            document.add(table);
            document.close();
            System.out.println(DEST + "生成成功!");
    
        }
    }
    
    Unit3-1:如何使用内部字体文件?

    如要使用系统自带的微软雅黑字体,
    首先,在类中增加静态常量:
    public static final String FONT = "C:/Windows/Fonts/msyh.ttc,0";
    接着,在方法体里(例如createPDF(String dest){ })添加:

    BaseFont unicode = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            Font font = new Font(unicode, 12, Font.NORMAL, new BaseColor(50, 205, 50));
    

    最后,将设置后的font格式应用到输入值("第一列")上
    new Phrase("第一列", font)

    Unit3-2:如何使用外部字体文件?

    若要使用从网络上下载的字体(如:vista.ttf)
    只需把public static final String FONT = "C:/Windows/Fonts/msyh.ttc,0";
    改成public static final String FONT = "results/font/vista.ttf";
    即可。

    相关文章

      网友评论

        本文标题:Java PDF中table的生成和使用

        本文链接:https://www.haomeiwen.com/subject/weucaqtx.html