JAVA操作PDF文件
PDF插入表单或图片
PDF插入表单数据前需要对模板进行处理,使用Adobe Acrobat DC 的准备表单功能添加文本域
表单数据MAP里的KEY必须与PDF添加的域名称一致才能添加进去
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
/*** @param templateFilePath PDF模版文件路径* @param data 表单数据* @param imageData 图片文件路径* @param disableEditing 生成后的PDF文件 true不可编辑 false可编辑* @param pdfFilePath 生成后PDF文件路径* @throws Exception*/@Testvoid test(String templateFilePath, HashMap<String, String> data, HashMap<String, String> imageData, boolean disableEditing, String pdfFilePath) throws Exception {PdfReader reader = null;ByteArrayOutputStream bos = null;PdfStamper pdfStamper = null;FileOutputStream fos = null;try {// 读取PDF模版文件reader = new PdfReader(templateFilePath);// 输出流bos = new ByteArrayOutputStream();// 构建PDF对象pdfStamper = new PdfStamper(reader, bos);// 获取表单数据AcroFields form = pdfStamper.getAcroFields();// 使用中文字体 使用 AcroFields填充值的不需要在程序中设置字体,在模板文件中设置字体为中文字体 Adobe 宋体 std LBaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);form.addSubstitutionFont(bfChinese);if (data != null && data.size() > 0) {// 表单赋值for (String key : data.keySet()) {form.setField(key, data.get(key));// 也可以指定字体form.setFieldProperty(key, "textfont", bfChinese, null);}}// 添加图片if (null != imageData && imageData.size() > 0) {for (String key : imageData.keySet()) {int pageNo = form.getFieldPositions(key).get(0).page;Rectangle signRect = form.getFieldPositions(key).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();// 读图片Image image = Image.getInstance(imageData.get(key));// 获取操作的页面PdfContentByte under = pdfStamper.getOverContent(pageNo);// 根据域的大小缩放图片image.scaleToFit(signRect.getWidth(), signRect.getHeight());// 添加图片image.setAbsolutePosition(x, y);under.addImage(image);}}pdfStamper.setFormFlattening(disableEditing);pdfStamper.close();// 保存文件fos = new FileOutputStream(pdfFilePath);fos.write(bos.toByteArray());fos.flush();} finally {if (null != fos) {try {fos.close();} catch (Exception e) {e.printStackTrace();}}if (null != bos) {try {bos.close();} catch (Exception e) {e.printStackTrace();}}if (null != reader) {try {reader.close();} catch (Exception e) {e.printStackTrace();}}}}<!--itextPDF依赖--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.2</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>
PDF转换为图片
多页PDF根据需要可创建文件夹循环存储图片
import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
@Testvoid test(String pdfSavePath,String imagePath) throws IOException {File newFile = new File(pdfSavePath);byte[] bytes = FileUtils.readFileToByteArray(newFile);List<byte[]> listByte = pdfToImage(bytes);OutputStream oute = new FileOutputStream(new File(imagePath));oute.write(listByte.get(0));oute.flush();oute.close();}/*** PDF转图片* @param fileContent PDF文件的二进制流* @return 图片文件的二进制流*/public List<byte[]> pdfToImage(byte[] fileContent) throws IOException {// dpi越大转换后越清晰,相对转换速度越慢Integer DPI = 300;//转换后的图片类型String IMG_TYPE = "png";List<byte[]> result = new ArrayList<>();PDDocument document = PDDocument.load(fileContent);ByteArrayOutputStream out =null;try {PDFRenderer renderer = new PDFRenderer(document);for (int i = 0; i < document.getNumberOfPages(); ++i) {BufferedImage bufferedImage = renderer.renderImageWithDPI(i, DPI);out = new ByteArrayOutputStream();ImageIO.write(bufferedImage, IMG_TYPE, out);result.add(out.toByteArray());}}finally {out.close();document.close();}return result;}<!--pdfbox依赖--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.20</version></dependency>
图片压缩处理
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
@Testvoid test() throws IOException {//输入文件byte[] bytes = FileUtils.readFileToByteArray(new File("C:\\Users\\LZW\\Desktop\\1.jpg"));//根据文件大小调整压缩质量 200*1024=200kb大小Float quality = 0.5f;if (bytes.length > 200 * 1024 && bytes.length < 2000 * 1024) {quality = 0.25f;}if (bytes.length > 4000 * 1024) {quality = 0.2f;}if (bytes.length > 6000 * 1024) {quality = 0.1f;}if (bytes.length > 10000 * 1024) {quality = 0.1f;}//压缩处理ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);//输出文件Thumbnails.of(byteArrayInputStream).scale(1f).outputQuality(quality).toFile("C:\\Users\\LZW\\Desktop\\new.jpg");}<!-- 图片压缩处理 --><dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.14</version></dependency>
JAVA操作PDF文件相关推荐
- java操作PDF文件,可支持分页、合并、图片转PDF等
java操作PDF,有一个很好用的工具--pdfbox.只需要引入依赖,即可使用. <dependency><groupId>org.apache.pdfbox</gro ...
- java中pdf写成base64文件流,Java操作pdf文件与Base64编码相互转换与文件流操作
1.第一步,引入bc包的安装依赖. 在pom.xml中引入. org.bouncycastle bcprov-jdk15on 1.60 引入后reimport一下项目. 2.pdf文件转换成Base6 ...
- Java操作pdf文件与Base64编码相互转换与文件流操作
1.第一步,引入bc包的安装依赖. 在pom.xml中引入. <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jd ...
- Java操作PDF文件,就是如此简单
maven 依赖 使用 iText 的时候需要用 maven 依赖如下: <dependency> <groupId>com.itextpdf</groupId> ...
- Java使用PDFBOX操作pdf文件(一,加载和创建pdf)
前言: 之前想学习使用Java操作pdf的时候看过了IText的文档.确实IText的文档很全,也有一个官网可以很方便的查找信息.但IText的开源协议为AGPL,使用者必须传染性的开源代码,商业使用 ...
- itex将html转成pdf加水印,itext操作PDF文件添加水印
功能描述:添加图片和文字水印 /** * * [功能描述:添加图片和文字水印] [功能详细描述:功能详细描述] * @param srcFile 待加水印文件 * @param destFile 加水 ...
- 使用ITEXT操作PDF文件
2019独角兽企业重金招聘Python工程师标准>>> 使用ITEXT操作PDF文件 pom.xml <dependency><groupId>com.ite ...
- bfo java_Java操作PDF文件(BFO) | 学步园
上一次我们用iText这个工具在Java环境下操作PDF文件,现在我们换一个工具:BFO iText的确小巧,但是功能也有限制,只能简单的生成PDF文件,BFO却不同,能设置字体.版面等元素. 最新版 ...
- Java操作word文件的工具选择
Java操作word文件的工具选择 使用Java语言,创建doc.docx.excel.pdf等文档,并对文档进行一系列操作. Spire.Doc for Java https://blog.csdn ...
最新文章
- 2020中国规模化敏捷大会-报名进行时
- WebService – 3.后台调用WebService,根级别上的数据无效
- mysql命令行的光标不显示和git-bash不能直接使用mysql登录的问题
- 打造一个实用的Ubuntu Linux
- 删除有序数组中的重复项 IIPython解法
- 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll的解决方法
- MySQL日常应用操作记录
- AC自动机 - 多模式串的匹配 --- HDU 3695 Computer Virus on Planet Pandora
- url参数拼接 php,PHP解析url并得到url参数方法总结
- CIKM 2021 | 基于异质图学习的搜索广告关键词推荐模型及实践
- 李彦宏再立 Flag:人工智能将让人类不再需要手机!
- OptiSystem:光纤陀螺仿真-Open-Loop IFOG-Matlab联合仿真
- Qt Creator配置FreeImage库
- 晶体三极管共射放大电路(共射基本放大电路)的研究与设计
- python 给qq点赞_Python学习二:使用Python实现在QQ空间批量点赞
- 如何批量将png格式改成jpg?
- matlab学生试用版,免费试用MATLAB
- Python Flask No.1_简介
- MySQL数据备份命令
- 【转载】eMule电驴使用从入门到精通(8)-------代理和高ID、低ID
热门文章
- MD5校验和资源代码热更(U3D)
- python 笔记 PySimpleGUI 图形界面6- 高级API调用-进度表控件、调试输出
- 2011年RSA大会纪实:手机恶意软件依旧是摇钱树
- 深度学习——day9(外 Q1 2021)基于多尺度特征融合的深度监督卷积神经网络路面裂缝检测
- php中sinfo代表什么,info.php · slulusu/家谱familytree - Gitee.com
- RHEL7-硬盘介绍和磁盘管理
- java培训总结(Java实验报告总结)
- 我的世界java1.3_我的世界JAVA版1.16.2-pre3
- 【报告分享】2021中国车市如何应对人口下滑冲击-易车研究院(附下载)
- 【微课制作软件】Focusky教程 | 制作微课小技巧 – 字幕与录音