PDFPortable Document Format的简称,意为“便携式文档格式”),是由Adobe Systems用于与应用程序、操作系统、硬件无关的方式进行文件交换所发展出的文件格式。PDF文件以PostScript语言图象模型为基础,无论在哪种打印机上都可保证精确的颜色和准确的打印效果,即PDF会忠实地再现原稿的每一个字符、颜色以及图象。(来自百度百科的介绍)。

可以用来处理pdf文件的第三方jar包主要有Apache PDFBox,iText (收费,功能更强大,功能更全面,最新版本itext7),XDocReport (将docx转化为pdf,需要借助poi和itext).

Apache PDFBox中的主要功能:创建文本,提取文本,合并文档,分割文档,删除页面等。

官网最新版是2.0.19

写了一个测试类,pdfbox非常不好用,在设置字体时,用的是内置常量,运行代码debug发现查找本地字体需要耗费很长时间,还有就是写入文档的时候,时间太久了,非常不好用,而且jar包中的字体类,内置的字体没有支持中文的字体,对中文不友好,不推荐使用。

这是测试类:(可以看一下)

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.junit.Test;import java.io.File;
import java.io.IOException;/*** @author xiaomifeng1010* @version 1.0* @date: 2020/5/3 15:11*/public class ApachePDFBoxTest {@Testpublic void createPdfFileTest(){//        创建文档页面(设置为矩形A4大小)PDPage page = new PDPage(PDRectangle.A4);//        创建pdf文档对象,以及页面内容流对象try ( PDDocument pdfDocument=new PDDocument();PDPageContentStream pageContentStream=new PDPageContentStream(pdfDocument,page)){pdfDocument.addPage(page);
//        设置字体为Helvetica-Bold或TIMES_ROMAN;,类库中没有中文字体,程序会去查找本地是否安装了该字体,查找非常慢PDFont font= PDType1Font.TIMES_ROMAN;
//            开始页面的文本操作pageContentStream.beginText();pageContentStream.setFont(font,12);pageContentStream.moveTextPositionByAmount(100,700);
//            因为jar包中自带的没有中文字体,所以写入中文会出异常pageContentStream.showText("hello");//            结束页面文本操作pageContentStream.endText();
//            pdf文档保存在本项目所在磁盘下data目录下File pdfFile=new File("E:"+File.separator+"data"+File.separator +"test.pdf");
//            保存pdf文档,写入非常慢!!测试了一下,写了一句hello,保存用了十几分钟,不知道为什么pdfDocument.save(pdfFile);System.out.println("文件写入成功");} catch (IOException e) {e.printStackTrace();}finally{
//            流虽然都关闭了,但是还是无法删除文件,所以手动调用一下gcSystem.gc();System.out.println("执行垃圾回收");}}
}

写入到文件非常慢(即执行save方法时),不推荐使用pdfbox.

处理pdf文件首推itext,使用7.1.8版本,导入jar包时候,选择itext-core这个jar包(最新版就是7.x系列),在idea中输入itext还会显示一个itextpdf,这个jar包还是5.x系列版本(属于旧版本)

  <!--推荐使用itext处理pdf文档--><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.8</version></dependency>

itext7-core包含了很多jar包,其中也包含了font-asian(可以用来处理中文字体)

font-asian.jar里面是有两种文件,展开cmap包,一种是cmap文件(编码文件),另一种是.properties文件(与字体程序有关)

设置中文字体时,还可以用window中已安装的字体,给出字体路径,每个字体的名称可以右键查看属性

import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.colors.DeviceGray;
import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.property.HorizontalAlignment;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.UnitValue;
import com.itextpdf.layout.property.VerticalAlignment;
import com.xiaomifeng1010.beanutils.bean.Person;
import org.junit.Test;import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** 使用itext操作pdf文档,在pdf中创建一个表格,将person属性存放到表格中。* @author xiaomifeng1010* @version 1.0* @date: 2020/5/3 19:49*/public class ITextTest {
//    保存文件的路径(当前项目所在磁盘下data目录下,pdf目录下的simple_table.pdf文件)public  String filePath=File.separator +"data"+File.separator+"pdf"+File.separator +"simple_table.pdf";
//    创建文件File file=new File(filePath);/*** 测试在pdf中写入一个表格*/@Testpublic void createPdfFileTest() {if (!file.exists()) {file.getParentFile().mkdirs();}try {
//            设置字体为HELVETICA(不支持中文)
//            PdfFont pdfFont= PdfFontFactory.createFont(StandardFonts.HELVETICA);
//            设置中文字体为黑体常规(传入一个字体路径或者itext中内置支持的字体,如上)PdfFont documentFont=PdfFontFactory.createFont("C:\\Windows\\Fonts\\simhei.ttf", PdfEncodings.IDENTITY_H,true);
//            使用font-asian中的字体,设置字体华文宋体(STSong-Light)PdfFont tableFont=PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H",true);PdfDocument pdfDocument=new PdfDocument(new PdfWriter(filePath));Document document=new Document(pdfDocument);
//            设置文本居中对齐document.setTextAlignment(TextAlignment.CENTER);document.setHorizontalAlignment(HorizontalAlignment.CENTER);
//            设置文档字体document.setFont(documentFont);
//            表格标题Paragraph tableTitle=new Paragraph("人员信息表");
//            设置表格标题字体和颜色(段落)tableTitle.setFont(documentFont).setFontColor(DeviceGray.BLACK);document.add(tableTitle);Table table=new Table(UnitValue.createPercentArray(3)).useAllAvailableWidth();
//            设置表格字体table.setFont(tableFont);
//            设置表格列宽table.setWidth(200);
//            设置表格背景色table.setBackgroundColor(ColorConstants.LIGHT_GRAY);
//            设置表格文本居中对齐table.setTextAlignment(TextAlignment.CENTER);
//            设置表格垂直对齐方式table.setVerticalAlignment(VerticalAlignment.MIDDLE);
//            设置表格水平对齐方式table.setHorizontalAlignment(HorizontalAlignment.CENTER);
//            Cell cell=new Cell();
//            设置单元格背景色为深灰色
//            cell.setBackgroundColor(ColorConstants.DARK_GRAY);List<Person> persons=new ArrayList<>();persons.add(new Person(12,"Albert","male"));persons.add(new Person(15,"Johnson","male"));persons.add(new Person(22,"Larry","female"));table.addCell(new Paragraph("姓名"));table.addCell(new Paragraph("年龄"));table.addCell(new Paragraph("性别"));for (Person person :persons) {
//                更精确的颜色可以使用new DeviceRgb()传入三原色的数值[0-255]来设置
//                new DeviceRgb(13,23,5);table.addCell(new Paragraph(person.getName()).setFontColor(DeviceRgb.RED));table.addCell(new Paragraph(String.valueOf(person.getAge())).setFontColor(DeviceRgb.GREEN));table.addCell(new Paragraph(person.getGender()).setFontColor(DeviceRgb.BLUE));}document.add(table);document.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

最终创建好的pdf文档:

打开文档查看具体效果:

itext官网中还提供了更多关于pdf的操作,具体可以参考官网示例: https://itextpdf.com/en/resources/examples

java处理pdf文件——iText的使用相关推荐

  1. 使用java导出pdf文件

    使用java导出pdf文件 itext itext的使用 JasperReports JasperReports与itext的区别 Jaspersoft Studio 工具简介 Jaspersoft ...

  2. 如何用 Java 对 PDF 文件进行电子签章

    转自:如何用 Java 对 PDF 文件进行电子签章 - Ferocious - 博客园 一.概述 二.技术选型 三.生成一个图片签章 四.如何按模板生成PDF文件 五.如何生成PKSC12证书 六. ...

  3. Java操作PDF之iText超入门

    转自:https://www.cnblogs.com/liaojie970/p/7132475.html Java操作PDF之iText超入门 iText是著名的开放项目,是用于生成PDF文档的一个j ...

  4. Java生成PDF文件_自用

    Java生成PDF文件 一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库.废话不多说,进入正题. 二.iText简介 ...

  5. Java合并pdf文件

    Java合并pdf文件 今天帮老师整理资料需要合并pdf文件,下了许多软件发现都需要VIP才行,所以写了个程序来帮助合并,直接在主程序中修改文件路径即可,如下图: 主要代码如下: package co ...

  6. Java实现pdf文件转图片

    Java实现pdf文件转图片 文章顺序是按照测试类- -Service- -Service实现类- -工具类- - POM依赖. test测试类里 pdfPath:存放pdf源文件的地方 imgflo ...

  7. java pdf 转换 word_如何使用Java将pdf文件转换为word文件

    如何使用Java将pdf文件转换为word文件? 而且,它看起来像它一样容易吗? 解决方法: public class PDFTextReader { static String pdftoText( ...

  8. 使用java实现pdf文件转换为jpg或者png(可以批量操作、分类存放)

    使用java实现pdf文件转换为jpg或者png(可以批量操作) 使用java代码实现将pdf转换为图片格式.支持归类,支持pdf多页分页面转换存放. 需求背景:有几百个文件夹,每个文件夹里有两个pd ...

  9. java 合并pdf报错,[Java教程]java合并PDF文件

    [Java教程]java合并PDF文件 0 2017-02-22 12:00:52 使用java代码合并PDF文件需要导入iText-2.1.7.jar包1 import java.io.FileOu ...

最新文章

  1. Reflection
  2. 阿里巴巴 Kubernetes 能力再获 CNCF 认可 | 云原生生态周报 Vol. 32
  3. Redis事务与监控
  4. 如何分析 StackOverflow 异常 ?
  5. 【图像处理】人脸检测--皱纹---变老特效
  6. 计算机游戏手机攻略,云顶之弈无敌攻略,竟然是用手机玩出来的
  7. 高性能MySQL读书笔记 (五)
  8. 干货 | 一文轻松了解NLP所有相关任务简介!
  9. Scrapy 发起post请求
  10. 电话聊天狂人(25 分)(散列函数)
  11. 想成功创业,你首先要有这样的思维
  12. N70常用软件大集合
  13. 超好用的笔记工具-notion入门指南
  14. 「2020总结文章」一起回顾 2020,展望 2021(JesksonUI-UniApp)
  15. VUE中toast的使用与开发
  16. openssl下载与安装
  17. 短线交易的自我训练:盘感从何而来?
  18. 计算机打游戏的硬件,玩电脑常见的六大误区 看看你犯了几条
  19. 什么是正向代理,开放的代理软件使用
  20. PHP写的人人网好友爬虫

热门文章

  1. 是否有一个“先前的兄弟”选择器?
  2. Win11怎么查看设备管理器?Win11设备管理器在哪里打开?
  3. moveit环境引入代码
  4. Web项目中前端页面通过URL传中文或 # 特殊字符到后台出现乱码解决方案
  5. logback日志配置文件
  6. mysql的游标处理_MySQL存储过程 游标 错误处理的示例代码
  7. 麦克纳姆轮全向移动机器人自旋转运动分析
  8. git 删除分支_深入浅出图解Git,入门到精通(保姆级教程)
  9. ubuntu之修改登陆密码
  10. php图片大小怎么改,如何批量修改图片大小/尺寸