摘要:在開發一些平臺中會遇到將數據庫中的數據渲染到模板文件中的場景,用完全動態生成文件的太過復雜,通過可以比較簡單的完成數據渲染工作模板的表單域數據需定義名稱獲取輸出流下載相關申請表下載設置響應設置響應文件名稱申請表設置文件名稱獲取輸出流
在開發一些平臺中會遇到將數據庫中的數據渲染到PDF模板文件中的場景,用itextPdf完全動態生成PDF文件的太過復雜,通過itextPdf/AcroFields可以比較簡單的完成PDF數據渲染工作(PDF模板的表單域數據需定義名稱)
Controller獲取HttpServletResponse 輸出流
package pdf.controller; import com.itextpdf.text.DocumentException; import service.PdfService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import java.io.IOException; import java.io.OutputStream; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @Controller @RequestMapping(WebConstants.WEB_pdf + "/download") @Api(description = "pdf下載相關", tags = "Pdf.download") @NoAuth public class PdfDownloadController { @Autowired private PdfService PdfService; @Value("${pdf.template.path}") private String templatePath ; @ApiOperation(value = "申請表下載") @RequestMapping(value = "/download/{id}", method = RequestMethod.GET) @ResponseBody @NoLogin public void download(@PathVariable("id") Long id, HttpServletResponse response) throws IOException, DocumentException { //設置響應contenType response.setContentType("application/pdf"); //設置響應文件名稱 String fileName = new String("申請表.pdf".getBytes("UTF-8"),"iso-8859-1"); //設置文件名稱 response.setHeader("Content-Disposition", "attachment; filename="+fileName); //獲取輸出流 OutputStream out = response.getOutputStream(); PdfService.download(id, templatePath ,out); } }
Service生成pdf數據響應輸出流
1.業務service-負責實現獲取pfd模板數據,數據庫數據,實現動態賦值生成PDF package service.impl; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.ResourceUtils; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.AcroFields; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; @Service public class ApplyServiceImpl implements ApplyService { @Override public DetailDTO getDetail(Long id) { // 獲取業務數據 return null; } @Override public MapgetPdfMapping(DetailDTO dto) { // TODO Auto-generated method stub // 獲取pdf與數據庫的數據字段映射map } @Override public void download(Long id, String templatePath, OutputStream out) { // TODO Auto-generated method stub DetailDTO dto = getDetail(id); Map fieldMapping = getPdfMapping(dto); String filePath; byte[] pdfTemplate; ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream(); try { //獲取模板文件路徑 filePath = ResourceUtils.getURL(templatePath).getPath(); //獲取模板文件字節數據 pdfTemplate = IOUtils.toByteArray(new FileInputStream(filePath)); //獲取渲染數據后pdf字節數組數據 byte[] pdfByteArray = generatePdfByTemplate(pdfTemplate, fieldMapping); pdfOutputStream.write(pdfByteArray); pdfOutputStream.writeTo(out); pdfOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { pdfOutputStream.close(); out.flush(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override //itextPdf/AcroFields完成PDF數據渲染 public byte[] generatePdfByTemplate(byte[] pdfTemplate, Map pdfParamMapping) { Assert.notNull(pdfTemplate, "template is null"); if (pdfParamMapping == null || pdfParamMapping.isEmpty()) { throw new IllegalArgumentException("pdfParamMapping can"t be empty"); } PdfReader pdfReader = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfStamper stamper = null; try { // 讀取pdf模板 pdfReader = new PdfReader(pdfTemplate); stamper = new PdfStamper(pdfReader, baos); //獲取所有表單字段數據 AcroFields form = stamper.getAcroFields(); form.setGenerateAppearances(true); // 設置 ArrayList fontList = new ArrayList<>(); fontList.add(getMsyhBaseFont()); form.setSubstitutionFonts(fontList); // 填充form for (String formKey : form.getFields().keySet()) { form.setField(formKey, pdfParamMapping.getOrDefault(formKey, StringUtils.EMPTY)); } // 如果為false那么生成的PDF文件還能編輯,一定要設為true stamper.setFormFlattening(true); stamper.close(); return baos.toByteArray(); } catch (DocumentException | IOException e) { LOGGER.error(e.getMessage(), e); } finally { if (stamper != null) { try { stamper.close(); } catch (DocumentException | IOException e) { LOGGER.error(e.getMessage(), e); } } if (pdfReader != null) { pdfReader.close(); } } throw new SystemException("pdf generate failed"); } /** * 默認字體 * * @return */ private BaseFont getDefaultBaseFont() throws IOException, DocumentException { return BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); } /** * 微軟宋體字體 * * @return */ //設定字體 private BaseFont getMsyhBaseFont() throws IOException, DocumentException { try { return BaseFont.createFont("/msyh.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); } catch (DocumentException | IOException e) { LOGGER.error(e.getMessage(), e); } return getDefaultBaseFont(); } }
數據庫的數據到pdf字段的映射可以使用配置,建立數據字段映射表,通過反射
可以將數據庫數 據對象轉為map,再通過定義的靜態map映射表,將數據map轉
換為pdf表單數據map
BeanUtils.bean2Map(bean); /** * JavaBean對象轉化成Map對象 * @param javaBean * @return */ public static Map bean2Map(Object javaBean) { Map map = new HashMap(); try { // 獲取javaBean屬性 BeanInfo beanInfo = Introspector.getBeanInfo(javaBean.getClass()); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); if (propertyDescriptors != null && propertyDescriptors.length > 0) { String propertyName = null; // javaBean屬性名 Object propertyValue = null; // javaBean屬性值 for (PropertyDescriptor pd : propertyDescriptors) { propertyName = pd.getName(); if (!propertyName.equals("class")) { Method readMethod = pd.getReadMethod(); propertyValue = readMethod.invoke(javaBean, new Object[0]); map.put(propertyName, propertyValue); } } } } catch (Exception e) { e.printStackTrace(); } return map; } 字段映射配置 public class PdfMapping { public final static MapBASE_INFO_MAPPING = new HashMap() { { put("name", "partyA"); put("identity", "baseIdentity"); } }; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76930.html
摘要:格式文檔導出,是信息系統中非常實用的一種功能,用于各種報表和文檔的到處。示例中,使用生成要導出的格式文檔,通過來實現文件下載。將轉換成文檔生成的代碼比較簡單,創建一個對象,然后會在指定的中輸入生成的文件。作用相當于在中使用進行配置。 showImg(https://segmentfault.com/img/remote/1460000008547574); PDF格式文檔導出,是信息系...
摘要:由于工作需要,要實現后端根據模板動態填充數據生成文檔,通過技術選型,使用來設計模板,結合工具庫來調用渲染生成文檔。 由于工作需要,要實現后端根據模板動態填充數據生成PDF文檔,通過技術選型,使用Ireport5.6來設計模板,結合JasperReports5.6工具庫來調用渲染生成PDF文檔。本人文采欠缺,寫作能力差,下面粗略的介紹其使用步驟,若有不對的地方,望大家莫噴,謝謝! 一、使...
摘要:一需求說明根據業務需要,需要在服務器端生成可動態配置的文檔,方便數據可視化查看。能配置動態的模板,正好解決了樣式動態渲染和排版問題。包負責模板之外的額外信息填寫,這里主要是頁眉頁腳的定制。包的畫圖工具包,目前只有一個線形圖。 一、需求說明:根據業務需要,需要在服務器端生成可動態配置的PDF文檔,方便數據可視化查看。 二、解決方案:iText+FreeMarker+JFreeChart生...
摘要:一需求說明根據業務需要,需要在服務器端生成可動態配置的文檔,方便數據可視化查看。能配置動態的模板,正好解決了樣式動態渲染和排版問題。包負責模板之外的額外信息填寫,這里主要是頁眉頁腳的定制。包的畫圖工具包,目前只有一個線形圖。 一、需求說明:根據業務需要,需要在服務器端生成可動態配置的PDF文檔,方便數據可視化查看。 二、解決方案:iText+FreeMarker+JFreeChart生...
閱讀 2395·2021-11-11 16:54
閱讀 1204·2021-09-22 15:23
閱讀 3645·2021-09-07 09:59
閱讀 1990·2021-09-02 15:41
閱讀 3283·2021-08-17 10:13
閱讀 3037·2019-08-30 15:53
閱讀 1235·2019-08-30 13:57
閱讀 1210·2019-08-29 15:16