美文网首页Java基础
Java生成PDF表格

Java生成PDF表格

作者: 莫问以 | 来源:发表于2018-12-06 15:03 被阅读17次

    PdfBox读取PDF加载pdf文件出错

    package com.unify.service;
    
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.pdmodel.PDPage;
    import org.apache.pdfbox.pdmodel.PDPageContentStream;
    import org.apache.pdfbox.pdmodel.font.PDFont;
    import org.apache.pdfbox.pdmodel.font.PDType1Font;
    
    public class createHelloPDF {
        
        public static void createPdf(){ 
        PDDocument doc = null;
        PDPage page = null;
         
         try {
             doc = new PDDocument();
             page = new PDPage();
             doc.addPage(page);
             PDFont font = PDType1Font.HELVETICA_BOLD;
             PDPageContentStream content = new PDPageContentStream(doc, page);
             content.beginText();
             content.setFont(font, 12);
             content.moveTextPositionByAmount(100, 700);
             String txt = "道可道,非常道;名可名,非常名。"
                            +"无名,万物之始,有名,万物之母。"
                            +"故常无欲,以观其妙,常有欲,以观其徼。"
                            +"此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。";
             content.drawString(txt);
    
             content.endText();
             content.close();
             doc.save("C:\\Users\\admin\\Downloads\\crt.pdf");
             doc.close();
         } catch (Exception e) {
             System.out.println(e);
         }
        }
        
        public static void main(String[] args) {
            createPdf();
            System.err.println("success");
        }
    }
    

    执行,报错:


    PdfBox不支持中文.png

    修改String txt内容为英文;

    String txt = "Faith can move mountains";
    

    执行代码,生成相应pdf文件至相应目录。

    • 利用PdfBox读取PDF内容,代码如下:
    package com.unify.service;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    
    import org.apache.pdfbox.io.RandomAccessBuffer;
    import org.apache.pdfbox.pdfparser.PDFParser;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.text.PDFTextStripper;
    
    public class PdfReader {
    
    static void ReadTxt(String path,int startPage,int endPage){
        File pdfFile = new File(path);
        boolean aa = pdfFile.canRead();
        System.err.println("检验是否可读---"+aa);
        PDDocument document = null;
        try{
            System.err.println("准备加载");
           
            // 方式一:      
    //        InputStream input = null;
    //        input = new FileInputStream( pdfFile );
    //        //加载 pdf 文档
    //        PDFParser parser = new PDFParser(new RandomAccessBuffer(input));
    //        parser.parse();
    //        document = parser.getPDDocument();
            
            // 方式二
            document=PDDocument.load(pdfFile);
        
            // 获取页码
            int pages = document.getNumberOfPages();
            System.err.println("该PDF一共有-"+pages+"页");
           
            //读文本内容
            PDFTextStripper stripper=new PDFTextStripper();
            
            // 设置按顺序输出
            stripper.setSortByPosition(true);
            stripper.setStartPage(startPage);
            stripper.setEndPage(endPage);
            String content = stripper.getText(document);
            System.out.println(content);     
        }catch(Exception e){
            System.out.println(e);
        }
    
    }
    }
    
    package com.unify.service;
    
    public class Test {
        public static void main(String[] args) {
            PdfReader.ReadTxt("C:\\Users\\admin\\Downloads\\crt.pdf",1,2);
            System.err.println("阅读结束");
        }
    }
    // 执行Test
    
    执行结果: 输出阅读内容.png

    新换一个PDF试试,比如唐诗三百首:

    加载文档出错.png

    查阅相关资料,可知PdfBox不支持中文,我们换一种方式进行PDF操作,通过itex插件进行pdf的生成和解析:

    通过itex插件操作PDF

    需要的jar包括以下几个:


    itex插件所需Jar包.jpg

    下载链接:https://download.csdn.net/download/weixin_39309402/10878446

    建一个简单model为User.java,代码:

    package com.xf.itex;
    
    public class User {
        private String name;    //姓名
        private int age ;       //年龄
        private int height; //身高
        private String adress;  //住址
        private String sex;     //性别
        private String love;    //爱好
        
       // getter和setter方法略
    }
    

    路径判断类:

    package com.xf.itex;
    
    import java.io.File;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    
    public class GenerateFold{
        
        /**
         * 判断路径是否存在 存在则用 不存在则创建
         * @param foldName  保存路径
         * @return          需要保存路径
         */
        public  String getFold(String foldName){
            SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
            
            String todayStr = format.format(Calendar.getInstance().getTime());
            
            String foldPath = foldName + File.separator + todayStr; 
            
            File file = new File(foldPath);
            
            if(!file.exists() && !file.isDirectory()){
                System.out.println("不存在");
                file.mkdirs();
            }else{
                System.out.println("存在");
            }
            return  foldPath;
        }
    }
    

    文件名创建:

    package com.xf.itex;
    
    import java.io.File;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.UUID;
    
    /**
     * 生成文件名
     */
    public class GenerateFileName{
        /**
         * 规则是:文件目录/生成时间-uuid(全球唯一编码).文件类别
         * @param fileDir  文件的存储路径
         * @param fileType 文件的类别
         * @return                 文件的名字  
         */
        public String generateFileName(String fileDir,String fileType){
            String saveFileName = "";
            SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSS");
            saveFileName += format.format(Calendar.getInstance().getTime());
            
            UUID uuid = UUID.randomUUID();  //全球唯一编码
            
            saveFileName += "-" + uuid.toString();
            saveFileName += "." + fileType;
            
            saveFileName = fileDir + File.separator + saveFileName;
            
            return saveFileName;
        }
    }
    

    创建表格Pdf代码:

    package com.xf.itex;
    
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.lowagie.text.Document;
    import com.lowagie.text.DocumentException;
    import com.lowagie.text.Element;
    import com.lowagie.text.Font;
    import com.lowagie.text.PageSize;
    import com.lowagie.text.Phrase;
    import com.lowagie.text.pdf.BaseFont;
    import com.lowagie.text.pdf.PdfPCell;
    import com.lowagie.text.pdf.PdfPTable;
    import com.lowagie.text.pdf.PdfWriter;
    
    /**
     * 生成pdf
     * 
     */
    public class CreatePdf{
        Document document = new Document();// 建立一个Document对象
    
        private static Font headfont;// 设置字体大小
        private static Font keyfont;// 设置字体大小
        private static Font textfont;// 设置字体大小
    
        static{
            //中文格式
            BaseFont bfChinese;
            try{
                // 设置中文显示
                bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
                headfont = new Font(bfChinese, 10, Font.BOLD);// 设置字体大小
                keyfont = new Font(bfChinese, 8, Font.BOLD);// 设置字体大小
                textfont = new Font(bfChinese, 8, Font.NORMAL);// 设置字体大小
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        
        /**
         * 文成文件
         * @param file 待生成的文件名
         */
        public CreatePdf(File file){
            document.setPageSize(PageSize.A4);// 设置页面大小
            try{
                PdfWriter.getInstance(document, new FileOutputStream(file));
                document.open();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        
        public CreatePdf(){
            
        }
        
        public void initFile(File file){
            document.setPageSize(PageSize.A4);// 设置页面大小
            try{
                PdfWriter.getInstance(document, new FileOutputStream(file));
                document.open();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        
    
        int maxWidth = 520;
        
        /**
         * 为表格添加一个内容
         * @param value           值
         * @param font            字体
         * @param align            对齐方式
         * @return                添加的文本框
         */
        public PdfPCell createCell(String value, Font font, int align){
            PdfPCell cell = new PdfPCell();
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell.setHorizontalAlignment(align);
            cell.setPhrase(new Phrase(value, font));
            return cell;
        }
        
        /**
         * 为表格添加一个内容
         * @param value           值
         * @param font            字体
         * @return                添加的文本框
         */
        public PdfPCell createCell(String value, Font font){
            PdfPCell cell = new PdfPCell();
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setPhrase(new Phrase(value, font));
            return cell;
        }
    
        /**
         * 为表格添加一个内容
         * @param value           值
         * @param font            字体
         * @param align            对齐方式
         * @param colspan        占多少列
         * @return                添加的文本框
         */
        public PdfPCell createCell(String value, Font font, int align, int colspan){
            PdfPCell cell = new PdfPCell();
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell.setHorizontalAlignment(align);
            cell.setColspan(colspan);
            cell.setPhrase(new Phrase(value, font));
            return cell;
        }
        
        /**
         * 为表格添加一个内容
         * @param value           值
         * @param font            字体
         * @param align            对齐方式
         * @param colspan        占多少列
         * @param boderFlag        是否有有边框
         * @return                添加的文本框
         */
        public PdfPCell createCell(String value, Font font, int align, int colspan,
                boolean boderFlag){
            PdfPCell cell = new PdfPCell();
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell.setHorizontalAlignment(align);
            cell.setColspan(colspan);
            cell.setPhrase(new Phrase(value, font));
            cell.setPadding(3.0f);
            if (!boderFlag){
                cell.setBorder(0);
                cell.setPaddingTop(15.0f);
                cell.setPaddingBottom(8.0f);
            }
            return cell;
        }
    
        /**
         * 创建一个表格对象
         * @param colNumber  表格的列数
         * @return              生成的表格对象
         */
        public PdfPTable createTable(int colNumber){
            PdfPTable table = new PdfPTable(colNumber);
            try{
                table.setTotalWidth(maxWidth);
                table.setLockedWidth(true);
                table.setHorizontalAlignment(Element.ALIGN_CENTER);
                table.getDefaultCell().setBorder(1);
            }catch (Exception e){
                e.printStackTrace();
            }
            return table;
        }
    
        public PdfPTable createTable(float[] widths){
            PdfPTable table = new PdfPTable(widths);
            try{
                table.setTotalWidth(maxWidth);
                table.setLockedWidth(true);
                table.setHorizontalAlignment(Element.ALIGN_CENTER);
                table.getDefaultCell().setBorder(1);
            }catch (Exception e){
                e.printStackTrace();
            }
            return table;
        }
    
        public PdfPTable createBlankTable(){
            PdfPTable table = new PdfPTable(1);
            table.getDefaultCell().setBorder(0);
            table.addCell(createCell("", keyfont));
            table.setSpacingAfter(20.0f);
            table.setSpacingBefore(20.0f);
            return table;
        }
    
        public <T> void generatePDF(String [] head,List<T> list,int colNum) {
            Class classType = list.get(0).getClass();
            
            // 创建一个只有5列的表格
            PdfPTable table = createTable(colNum);
    
            // 添加备注,靠左,不显示边框
            table.addCell(createCell("APP信息列表:", keyfont, Element.ALIGN_LEFT, colNum,false));
            
            //设置表头
            for(int i = 0 ; i < colNum ; i++){
                table.addCell(createCell(head[i], keyfont, Element.ALIGN_CENTER));
            }
            
            
            if(null != list && list.size() > 0){
                int size = list.size();
                for(int i = 0 ; i < size ; i++){
                    T t = list.get(i);
                    for(int j = 0 ; j < colNum ; j ++){
                        //获得首字母
                        String firstLetter = head[j].substring(0,1).toUpperCase(); 
                        
                        //获得get方法,getName,getAge等
                        String getMethodName = "get" + firstLetter + head[j].substring(1);
                       
                        Method method;
                        try{
                            //通过反射获得相应的get方法,用于获得相应的属性值
                            method = classType.getMethod(getMethodName, new Class[]{});
                            try{
                                 System.out.print(getMethodName +":" + method.invoke(t, new Class[]{}) +",");
                                 //添加数据
                                 table.addCell(createCell(method.invoke(t, new Class[]{}).toString(), textfont));
                            }catch (IllegalArgumentException e){
                                e.printStackTrace();
                            }catch (IllegalAccessException e){
                                e.printStackTrace();
                            }catch (InvocationTargetException e){
                                e.printStackTrace();
                            }  
                        }catch (SecurityException e){
                            e.printStackTrace();
                        }catch (NoSuchMethodException e){
                            e.printStackTrace();
                        }
                    }
                    
                    System.out.println("");
                }
            }
            
            try{
                //将表格添加到文档中
                document.add(table);
            }catch (DocumentException e){
                e.printStackTrace();
            }
            
            //关闭流
            document.close();
        }
        
        
        /**
         * 提供外界调用的接口,生成以head为表头,list为数据的pdf
         * @param head  //数据表头
         * @param list  //数据
         * @return        //excel所在的路径
         */
        public <T> String generatePDFs(String [] head,List<T> list){
            final String FilePath = "pdfPath";
            String saveFilePathAndName = "";
        
            //获得存储的根目录
            String savePath = "F:\\Temp";
            
            //获得当天存储的路径,不存在则生成当天的文件夹
            String realSavePath = new GenerateFold().getFold(savePath);
            
            saveFilePathAndName = new GenerateFileName().generateFileName(realSavePath,"pdf");
            
            File file = new File(saveFilePathAndName);
            try{
                file.createNewFile();
            }catch (IOException e1){
         
                e1.printStackTrace();
            }
                initFile(file);
            try{
                file.createNewFile();  //生成一个pdf文件
            }catch (IOException e){
                e.printStackTrace();
            }
            new CreatePdf(file).generatePDF(head,list,head.length);
            
            return saveFilePathAndName;
        }
    
    }
    

    测试Test类:

    package com.xf.itex;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Test {
        public static void main(String[] args) {
            System.out.println("begin");
            
            String [] head = {"name","age","height","adress","sex","love"};
            
            List<User> list = new ArrayList<User>();
            User user1 = new User("李逍遥",21,185,"渔村","男","打架");
            User user2 = new User("林月如",18,177,"南武林","女","打架");
            
            list.add(user1);
            list.add(user2);
            
            
            String filePath = new CreatePdf().generatePDFs(head,list);
            System.out.println(filePath);
            System.out.println("end");
        }
    }
    
    创建pdf成功.png pdf内容.png

    成功!有时间再写其他

    相关文章

      网友评论

        本文标题:Java生成PDF表格

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