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文件相关推荐

  1. java操作PDF文件,可支持分页、合并、图片转PDF等

    java操作PDF,有一个很好用的工具--pdfbox.只需要引入依赖,即可使用. <dependency><groupId>org.apache.pdfbox</gro ...

  2. java中pdf写成base64文件流,Java操作pdf文件与Base64编码相互转换与文件流操作

    1.第一步,引入bc包的安装依赖. 在pom.xml中引入. org.bouncycastle bcprov-jdk15on 1.60 引入后reimport一下项目. 2.pdf文件转换成Base6 ...

  3. Java操作pdf文件与Base64编码相互转换与文件流操作

    1.第一步,引入bc包的安装依赖. 在pom.xml中引入. <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jd ...

  4. Java操作PDF文件,就是如此简单

    maven 依赖 使用 iText 的时候需要用 maven 依赖如下: <dependency> <groupId>com.itextpdf</groupId> ...

  5. Java使用PDFBOX操作pdf文件(一,加载和创建pdf)

    前言: 之前想学习使用Java操作pdf的时候看过了IText的文档.确实IText的文档很全,也有一个官网可以很方便的查找信息.但IText的开源协议为AGPL,使用者必须传染性的开源代码,商业使用 ...

  6. itex将html转成pdf加水印,itext操作PDF文件添加水印

    功能描述:添加图片和文字水印 /** * * [功能描述:添加图片和文字水印] [功能详细描述:功能详细描述] * @param srcFile 待加水印文件 * @param destFile 加水 ...

  7. 使用ITEXT操作PDF文件

    2019独角兽企业重金招聘Python工程师标准>>> 使用ITEXT操作PDF文件 pom.xml <dependency><groupId>com.ite ...

  8. bfo java_Java操作PDF文件(BFO) | 学步园

    上一次我们用iText这个工具在Java环境下操作PDF文件,现在我们换一个工具:BFO iText的确小巧,但是功能也有限制,只能简单的生成PDF文件,BFO却不同,能设置字体.版面等元素. 最新版 ...

  9. Java操作word文件的工具选择

    Java操作word文件的工具选择 使用Java语言,创建doc.docx.excel.pdf等文档,并对文档进行一系列操作. Spire.Doc for Java https://blog.csdn ...

最新文章

  1. 2020中国规模化敏捷大会-报名进行时
  2. WebService – 3.后台调用WebService,根级别上的数据无效
  3. mysql命令行的光标不显示和git-bash不能直接使用mysql登录的问题
  4. 打造一个实用的Ubuntu Linux
  5. 删除有序数组中的重复项 IIPython解法
  6. 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll的解决方法
  7. MySQL日常应用操作记录
  8. AC自动机 - 多模式串的匹配 --- HDU 3695 Computer Virus on Planet Pandora
  9. url参数拼接 php,PHP解析url并得到url参数方法总结
  10. CIKM 2021 | 基于异质图学习的搜索广告关键词推荐模型及实践
  11. 李彦宏再立 Flag:人工智能将让人类不再需要手机!
  12. OptiSystem:光纤陀螺仿真-Open-Loop IFOG-Matlab联合仿真
  13. Qt Creator配置FreeImage库
  14. 晶体三极管共射放大电路(共射基本放大电路)的研究与设计
  15. python 给qq点赞_Python学习二:使用Python实现在QQ空间批量点赞
  16. 如何批量将png格式改成jpg?
  17. matlab学生试用版,免费试用MATLAB
  18. Python Flask No.1_简介
  19. MySQL数据备份命令
  20. 【转载】eMule电驴使用从入门到精通(8)-------代理和高ID、低ID

热门文章

  1. MD5校验和资源代码热更(U3D)
  2. python 笔记 PySimpleGUI 图形界面6- 高级API调用-进度表控件、调试输出
  3. 2011年RSA大会纪实:手机恶意软件依旧是摇钱树
  4. 深度学习——day9(外 Q1 2021)基于多尺度特征融合的深度监督卷积神经网络路面裂缝检测
  5. php中sinfo代表什么,info.php · slulusu/家谱familytree - Gitee.com
  6. RHEL7-硬盘介绍和磁盘管理
  7. java培训总结(Java实验报告总结)
  8. 我的世界java1.3_我的世界JAVA版1.16.2-pre3
  9. 【报告分享】2021中国车市如何应对人口下滑冲击-易车研究院(附下载)
  10. 【微课制作软件】Focusky教程 | 制作微课小技巧 – 字幕与录音