Java实现PDF生成(Word文档转Pdf)
生活随笔
收集整理的這篇文章主要介紹了
Java实现PDF生成(Word文档转Pdf)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
準備工作
1, 準備模板,模板為Word 文檔,當修改好想要的格式后,保存為Pdf格式。
2,準備軟件(Adobe Acrobat 9 Pro), 需要編輯PDF,如哪里需要添加文字,哪里需要添加圖片
軟件部分
1.點擊表單,啟動表單向?qū)?- 現(xiàn)有文檔, 一直下一步打開需要編輯的PDF
2.進入該頁面,右鍵,文本框劃出,選擇你需要的樣式等
軟件部分需要注意的
1,如圖中的框內(nèi)的Key,需要和Java代碼的Key一致,下面會講到。
2.框框的底部不會真的在你的橫線上(橫線是Word文檔就已經(jīng)畫好的)
3.插入圖片也是拉個文本框
Java 代碼
這個是別人的,下面我自己做了些優(yōu)化
復(fù)制代碼 package wp.util;import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map;import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; /*** Created by wangpeng on 2018/02/01.*/ public class PdfUtils {// 利用模板生成pdf public static void pdfout(Map<String,Object> o) {// 模板路徑 String templatePath = "C:/mytest.pdf";// 生成的新文件路徑 String newPDFPath = "C:/testout1.pdf";PdfReader reader;FileOutputStream out;ByteArrayOutputStream bos;PdfStamper stamper;try {BaseFont bf = BaseFont.createFont("c://windows//fonts//simsun.ttc,1" , BaseFont.IDENTITY_H, BaseFont.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();//文字類的內(nèi)容處理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);}//圖片類的內(nèi)容處理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();//根據(jù)路徑讀取圖片Image image = Image.getInstance(imgpath);//獲取圖片頁面PdfContentByte under = stamper.getOverContent(pageNo);//圖片大小自適應(yīng)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("creatdate","2018年1月1日");map.put("weather","晴朗");map.put("sports","打羽毛球");Map<String,String> map2 = new HashMap();map2.put("img","c:/50336.jpg");Map<String,Object> o=new HashMap();o.put("datemap",map);o.put("imgmap",map2);pdfout(o);} }我自己的,加入了一些優(yōu)化,看不懂的就結(jié)合起來看一下
package com.yekj.ps01.utils;import com.aliyun.oss.OSSClient; import com.aliyun.oss.model.GeneratePresignedUrlRequest; import com.itextpdf.text.*; import com.itextpdf.text.Font; import com.itextpdf.text.Image; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*; import com.yekj.ps01.config.OssConfig; import com.yekj.ps01.service.db.DBOperationI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile;import java.awt.*; import java.io.*; import java.net.URL; import java.util.Date; import java.util.HashMap; import java.util.Map;/*** @author ZXY* @date 2021年3月1日14:13:47* @description 生成PDf* @param* @param*/ @Service public class PdfUtils {private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class);// 利用模板生成pdfpublic Map<String , Object> pdfout2(Map<String,Object> o,String pdfName,String orederId) {// 模板路徑String templatePath = "D:\\localA\\src\\main\\resources\\static\\pdfTemplate\\testdriver.pdf";String newPDFPath = "C:\\Users\\Administrator\\Desktop/ttttdd.pdf";//String templatePath = "/var/testDriver/pdf/testdriver.pdf";// 生成的新文件路徑//String newPDFPath = "/var/testDriver/pdf/pdfTemplate/"+pdfName;PdfReader reader;FileOutputStream out;ByteArrayOutputStream bos;PdfStamper stamper;try {BaseFont bf = BaseFont.createFont("templates/font/simsun.ttc,1" , BaseFont.IDENTITY_H, BaseFont.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();//文字類的內(nèi)容處理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);}//圖片類的內(nèi)容處理Map<String,String> imgmap = (Map<String,String>)o.get("imgmap");for(String key : imgmap.keySet()) {try {String value = imgmap.get(key);logger.info("獲取PDF圖片 key 為: {} , 值為:",key, value);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();String replace = "";try {//使用你們的地址OSSClient ossClient = new OSSClient("http://oss-cn-12453456.com","LTAI5tHRWiezWS7AKgEpkHGb", "klI71IqG6eAYo9w0GbZOR3BBE6Bbpv");GeneratePresignedUrlRequest generatePresignedUrlRequest ;// 設(shè)置URL過期時間為1小時Date expiration = new Date(new Date().getTime() + 3600 * 1000);// 正式環(huán)境generatePresignedUrlRequest =new GeneratePresignedUrlRequest("caftdt-prod", "123456789/"+imgpath);generatePresignedUrlRequest.setExpiration(expiration);URL urls = ossClient.generatePresignedUrl(generatePresignedUrlRequest);String string = urls.toString();//正式環(huán)境replace = string.replace("http://1234.cn");}catch (Exception ex){ex.printStackTrace();logger.error("轉(zhuǎn)換PDF獲取圖片地址鏈接錯誤 :{} ",ex);}Image image = Image.getInstance(replace);//獲取圖片頁面PdfContentByte under = stamper.getOverContent(pageNo);//圖片大小自適應(yīng)image.scaleToFit(signRect.getWidth(), signRect.getHeight());//處理簽名旋轉(zhuǎn)if (key.equals("userImg")){//旋轉(zhuǎn)圖片image.setRotationDegrees(90);}//添加圖片image.setAbsolutePosition(x, y);under.addImage(image);}catch (Exception ex){ex.printStackTrace();logger.error("PDF圖片處理錯誤 :{} ,錯誤為: {}",key,ex.getMessage());}}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 = null;///循環(huán)是處理成品只顯示一頁的問題for (int i=1;i<=reader.getNumberOfPages();i++){importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);copy.addPage(importPage);}doc.close();} catch (IOException e) {e.printStackTrace();logger.error("PDF 生成時內(nèi)部異常: {}",e);} catch (DocumentException e) {e.printStackTrace();logger.error("PDF 異常了: {}",e);}return null;} }**這里需要特別注意,這里的Key,必須要和軟件里面的Key一致不然會寫入的時候沒有值**map2.put("imgA",imgA);map2.put("imgB",imgB);//用戶簽字圖片map2.put("userImg",userImg);Map<String,Object> o=new HashMap();logger.info("PDF 圖片信息處理完畢 " );o.put("datemap",map);o.put("imgmap",map2);pdf.pdfout(o, pdfName, testId);總結(jié)
以上是生活随笔為你收集整理的Java实现PDF生成(Word文档转Pdf)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据库 常用函数_《MySQL
- 下一篇: MySQL查询结果条数编号示例 mys