Java操作pdf文件的方法大全
更新时间:2024年04月30日 08:29:48 作者:花自飘0水自流
这篇文章主要为大家详细介绍了Java操作pdf文件的相关知识,例如合并pdf文件,手绘pdf文件以及导出PDF文件等,有需要的小伙伴可以参考一下
一、判断一个文件是否是pdf文件
pdf文件头部位置,包含着PDF版本信息,可以通过这个来判断:
@PostMapping(value = "/upload") public void uploadFile(@RequestParam MultipartFile file) { InputStream inputStream = null; try { inputStream = file.getInputStream(); if (file.getOriginalFilename().endsWith("pdf") || file.getOriginalFilename().endsWith("PDF")) { // pdf检查 if (!checkPdfType(inputStream)) { logger.info("pdf文件检查失败"); return result.failed().template(StandardI18nTemplate.MSG_Error).arguments("请上传合法的pdf文件"); } // 流重置 inputStream.reset(); } } catch (Exception e) { logger.error("上传失败", e); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { logger.error("关闭inputStream失败", e); } } } } // 读取前几个字符,判断有没有PDF关键字 public boolean checkPdfType(InputStream inputStream) { try { byte[] bytes = new byte[20]; inputStream.read(bytes); String string = new String(bytes); if (!string.contains("PDF")) { return false; } } catch (Exception e) { logger.error("checkPdfType error", e); return false; } return true; }
二、多个pdf文件合并为一个
1、需要的包
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.3</version> </dependency>
2、实现
import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; public static void main(String[] args) { List<String> pdfs = new ArrayList<>(); pdfs.add("E:\\test.pdf"); pdfs.add("E:\\test2.pdf"); mergePdf(pdfs, "E:\\merge.pdf"); } /** * 将多个pdf合并成一个pdf文件 */ public static void mergePdf(List<String> pdfs, String mergeFilePath) { List<PdfReader> readers = new ArrayList<>(); try { // 创建一个新的文档 Document document = new Document(); // 创建一个PDF复制对象 PdfCopy copy = new PdfCopy(document, new FileOutputStream(mergeFilePath)); // 打开文档 document.open(); // 读取需要合并的PDF文件 for (String file : pdfs) { readers.add(new PdfReader(file)); } for (PdfReader reader : readers) { // 将读取的PDF文件合并到新的文档中 copy.addDocument(reader); } // 关闭文档 document.close(); logger.info("PDF合并完成!"); } catch (Exception e) { logger.error("PDF合并失败!", e); } finally { for (PdfReader reader : readers) { if (reader != null) { reader.close(); } } } }
三、使用itextpdf5手绘pdf
1、需要的包
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.3</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>
官网:https://kb.itextpdf.com/home/it7kb/ebooks
2、代码
import com.itextpdf.text.*; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfPCell; import java.io.IOException; public class PdfHelper { // 宋体 汉字支持 public static BaseFont STSongLight; static { try { STSongLight = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); } catch (DocumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 汉字支持,宋体支持 */ public static BaseFont getSTSongLightBaseFont() { return STSongLight; } public static PdfPCell getCell(String text, int colspan, int rowspan) { Font font = new Font(STSongLight, 16); Chunk chunk = new Chunk(text, font); Paragraph paragraph = new Paragraph(chunk); PdfPCell cell = new PdfPCell(paragraph); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setColspan(colspan); cell.setRowspan(rowspan); return cell; } }
import com.itextpdf.text.*; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; import java.io.FileOutputStream; import java.io.IOException; public class PdfTest { public static void main(String[] args) throws IOException, DocumentException { // 定义pdf大小为A4纸大小,并且上下左右边距都为50 Document document = new Document(PageSize.A4, 50, 50, 50, 50); PdfWriter.getInstance(document, new FileOutputStream("G:\\test.pdf")); document.open(); // 1、输出一个段落 document.add(new Paragraph("Hello World!")); // 2、添加空行 document.add(Chunk.NEWLINE); // 3、添加列表 // 字体可以设置 大小,加粗/倾斜下划线等,颜色 ,可以通过构造方法一行生成,也可以调用set方法 Font font3 = new Font(PdfHelper.getSTSongLightBaseFont(), 18f, Font.BOLD, new BaseColor(0, 0, 255)); // 文本 加上这个才会显示中文!! Chunk chunk = new Chunk("列表输出:", font3); // 段落 Paragraph paragraph3 = new Paragraph(chunk); paragraph3.setFont(font3);// 字体 paragraph3.setPaddingTop(10); paragraph3.setAlignment(Element.ALIGN_CENTER); // 居中 document.add(paragraph3); // Create a List List list3 = new List(); list3.setSymbolIndent(12); list3.setListSymbol("\u2022"); // 列表符号 // Add ListItem objects 可以设置字体等 ListItem listItem3 = new ListItem("Never gonna give you up"); listItem3.setFont(font3); list3.add(listItem3); list3.add(new ListItem("Never gonna let you down")); list3.add(new ListItem("Never gonna run around and desert you")); list3.add(new ListItem("Never gonna make you cry")); list3.add(new ListItem("Never gonna say goodbye")); list3.add(new ListItem("Never gonna tell a lie and hurt you")); // Add the list document.add(list3); document.add(Chunk.NEWLINE); // 4.添加图片 // 段落 Paragraph paragraph4 = new Paragraph(); paragraph4.add(new Chunk("我是java搬运工,我会", new Font(PdfHelper.getSTSongLightBaseFont(), 18f))); Image image4_1 = Image.getInstance("G:\\docker.png"); // 也可以传递网络图片 // image4_1.setAlignment(Element.ALIGN_CENTER); image4_1.scaleToFit(50, 50); // 宽高限制 paragraph4.add(image4_1); paragraph4.add(new Chunk("我还会", new Font(PdfHelper.getSTSongLightBaseFont(), 18f))); Image image4_2 = Image.getInstance("G:\\mybatis.jpg"); // 也可以传递网络图片 // image4_2.setAlignment(Element.ALIGN_CENTER); image4_2.scaleToFit(50, 50); // 宽高限制 paragraph4.add(image4_2); document.add(paragraph4); document.add(Chunk.NEWLINE); // 5.表格 // 7列的表格 PdfPTable table5 = new PdfPTable(7); // 每一列表格的宽度比例 float[] columnWidths = {3, 3, 2, 3, 2, 4, 3}; table5.setWidths(columnWidths); table5.setWidthPercentage(95);// 表格占页面的比例 PdfPCell defaultCell5 = table5.getDefaultCell(); defaultCell5.setBorder(1); // 边框 defaultCell5.setPadding(2); table5.addCell(PdfHelper.getCell("姓名", 1, 1)); table5.addCell(PdfHelper.getCell("张三", 1, 1)); table5.addCell(PdfHelper.getCell("性别", 1, 1)); table5.addCell(PdfHelper.getCell("男", 1, 1)); table5.addCell(PdfHelper.getCell("年龄", 1, 1)); table5.addCell(PdfHelper.getCell("18", 1, 1)); Image img = Image.getInstance("G:\\docker.png"); img.scaleToFit(83, 168); PdfPCell imageCell = new PdfPCell(img); imageCell.setBorderWidth(0); imageCell.setHorizontalAlignment(Element.ALIGN_LEFT); // 设置单元格内容水平对齐方式 imageCell.setColspan(1); imageCell.setRowspan(3); imageCell.setPadding(2); table5.addCell(imageCell); document.add(table5); // 关闭文档 document.close(); } }
4、效果
四、根据pdf模板导出pdf
1、引包
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.3</version> </dependency>
2、准备pdf模板
(1)我们使用wps打开原始PDF 注意,wps编辑表单需要会员,可以使用其他软件(Adobe Acrobat Pro或者福昕等)
(2)编辑表单
最终的结果:双击黑框可以编辑文字格式:
3、编码
import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * Created by cxf on 2019/11/12. * https://www.cnblogs.com/wangpeng00700/p/8418594.html * 用Adobe Acrobat Pro创建表单 */ public class ItextPdfUtils { // 利用模板生成pdf public static void pdfout(Map<String,Object> o) { // 模板路径 String templatePath = "E:\\mytest.pdf"; // 生成的新文件路径 String newPDFPath = "E:\\testout1.pdf"; PdfReader reader; FileOutputStream out; ByteArrayOutputStream bos; PdfStamper stamper; try { BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font FontChinese = new Font(bf, 5, Font.NORMAL); out = new FileOutputStream(newPDFPath);// 输出流 reader = new PdfReader(templatePath);// 读取pdf模板 bos = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, bos); AcroFields form = stamper.getAcroFields(); //文字类的内容处理 Map<String,String> datemap = (Map<String,String>)o.get("datemap"); form.addSubstitutionFont(bf); for(String key : datemap.keySet()){ String value = datemap.get(key); form.setField(key,value); } //图片类的内容处理 Map<String,String> imgmap = (Map<String,String>)o.get("imgmap"); for(String key : imgmap.keySet()) { String value = imgmap.get(key); String imgpath = value; 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(imgpath); //获取图片页面 PdfContentByte under = stamper.getOverContent(pageNo); //图片大小自适应 image.scaleToFit(signRect.getWidth(), signRect.getHeight()); //添加图片 image.setAbsolutePosition(x, y); under.addImage(image); } stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑 stamper.close(); Document doc = new Document(); Font font = new Font(bf, 32); PdfCopy copy = new PdfCopy(doc, out); doc.open(); PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1); copy.addPage(importPage); doc.close(); } catch (IOException e) { System.out.println(e); } catch (DocumentException e) { System.out.println(e); } } public static void main(String[] args) { Map<String,String> map = new HashMap(); map.put("name","张三"); map.put("age","永远18"); map.put("weather","晴朗"); Map<String,String> map2 = new HashMap(); map2.put("img","E:\\mybatis.jpg"); Map<String,Object> o=new HashMap(); o.put("datemap",map); o.put("imgmap",map2); pdfout(o); } }
以上就是Java操作pdf文件的方法大全的详细内容,更多关于Java操作pdf的资料请关注脚本之家其它相关文章!
相关文章
将ResultSet中得到的一行或多行结果集封装成对象的实例
这篇文章主要介绍了将ResultSet中得到的一行或多行结果集封装成对象的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-05-05如何实现springboot中controller之间的相互调用
这篇文章主要介绍了实现springboot中controller之间的相互调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06Springboot全局异常捕获及try catch区别解析
这篇文章主要介绍了Springboot全局异常捕获及try catch区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-06-06
最新评论