Java生成PDF表格

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");
    }
}

执行,报错:


13566833-b92708da47a7895e.png
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

执行结果:
13566833-741af06a6dabb345.png
输出阅读内容.png

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

13566833-68194ba539741c44.png
加载文档出错.png

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

通过itex插件操作PDF

需要的jar包括以下几个:


13566833-93ec8101724c66f9.jpg
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");
    }
}
13566833-ca2f3f842698856a.png
创建pdf成功.png
13566833-6c65c09f42166c88.png
pdf内容.png

成功!有时间再写其他

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值