PdfBox读取PDF加载pdf文件出错
-
下载相关Jar包(pdfbox和fontbox为主)
网址http://pdfbox.apache.org/download.cgi -
准备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
成功!有时间再写其他
网友评论