您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關spring-boot中怎么實現一個PDF打印功能,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
1.導入jar(一定要注意版本,踩過很多坑)
<!--pdf依賴--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.1</version> </dependency> <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>
2.工具類
package com.sungrow.sgframe.api.isolarapi.machineconfigservice.util; import com.itextpdf.text.*; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; import lombok.extern.log4j.Log4j2; import org.sg.tools.config.SungwsConfig; import org.sg.tools.util.UUIDUtil; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; /** * @author shihaifeng * @date 2019-09-29 11:03 * @desc (PDF工具類) **/ @Log4j2 public class PDFUtil { private static Document document = null;// 建立一個Document對象 private static int maxWidth = 520; private static Font headfont;// 設置字體大小 private static Font keyfont;// 設置字體大小 private static Font textfont;// 設置字體大小 static { BaseFont bfChinese; try { bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); headfont = new Font(bfChinese, 10, Font.BOLD);// 設置字體大小 keyfont = new Font(bfChinese, 8, Font.BOLD);// 設置字體大小 textfont = new Font(bfChinese, 8, Font.NORMAL);// 設置字體大小 } catch (Exception e) { e.printStackTrace(); log.error(e.getMessage(), e); } } /** * 初始化文檔 */ private static void initDocument(File file) { document = new Document();//每一次初始化一個document 不然會有問題 open()方法有問題 document.setPageSize(PageSize.A4);// 設置頁面大小 try { FileOutputStream fileOutputStream = new FileOutputStream(file); PdfWriter.getInstance(document, fileOutputStream) .setViewerPreferences(PdfWriter.PageModeUseThumbs); document.open(); } catch (Exception e) { e.printStackTrace(); log.error(e.getMessage(), e); } } /** * 創建table * * @param colNumber * @return */ private static PdfPTable createTable(int colNumber) { PdfPTable table = new PdfPTable(colNumber); try { table.setTotalWidth(maxWidth); table.setLockedWidth(true); table.setHorizontalAlignment(Element.ALIGN_CENTER); table.getDefaultCell().setBorder(1); } catch (Exception e) { e.printStackTrace(); log.error(e.getMessage(), e); } return table; } /** * 創建table * * @param widths * @return */ private PdfPTable createTable(float[] widths) { PdfPTable table = new PdfPTable(widths); try { table.setTotalWidth(maxWidth); table.setLockedWidth(true); table.setHorizontalAlignment(Element.ALIGN_CENTER); table.getDefaultCell().setBorder(1); } catch (Exception e) { e.printStackTrace(); log.error(e.getMessage(), e); } return table; } /** * 創建 空table * * @return */ private static PdfPCell createBlankTable() { PdfPCell cell = new PdfPCell(); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); Paragraph paragraph = new Paragraph("", getPdfChineseFont()); cell.setPhrase(paragraph); return cell; } /** * 創建列 * * @param value * @param font * @param align * @return */ private PdfPCell createCell(String value, Font font, int align) { PdfPCell cell = new PdfPCell(); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(align); Paragraph paragraph = new Paragraph(String.valueOf(value), getPdfChineseFont()); cell.setPhrase(paragraph); return cell; } /** * 創建列 * * @param value * @param font * @return */ private static PdfPCell createHeadCell(String value, Font font) { PdfPCell cell = new PdfPCell(); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setBackgroundColor(new BaseColor(22022022)); cell.setFixedHeight(25.0f); Font headFont = getPdfChineseFont(); headFont.setColor(new BaseColor(0xff0000)); headFont.setSize(14); headFont.setStyle("bold"); Paragraph paragraph = new Paragraph(String.valueOf(value), headFont); cell.setPhrase(paragraph); return cell; } /** * 創建列 * * @param value * @param font * @param rowSpan 占多列 * @param colspan 占多行 * @return */ private static PdfPCell createCell(String value, Font font, int rowSpan, int colspan) { PdfPCell cell = new PdfPCell(); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setRowspan(rowSpan); cell.setColspan(colspan); Paragraph paragraph = new Paragraph(String.valueOf(value), getPdfChineseFont()); cell.setPhrase(paragraph); return cell; } /** * 創建列 * * @param value * @param font * @param align * @param colspan * @param boderFlag * @return */ private static PdfPCell createCell(String value, Font font, int align, int colspan, boolean boderFlag) { PdfPCell cell = new PdfPCell(); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(align); cell.setColspan(colspan); Paragraph paragraph = new Paragraph(String.valueOf(value), getPdfChineseFont()); cell.setPhrase(paragraph); cell.setPadding(3.0f); if (!boderFlag) { cell.setBorder(0); cell.setPaddingTop(15.0f); cell.setPaddingBottom(8.0f); } return cell; } /** * 增加中文顯示 * * @return */ private static Font getPdfChineseFont() { BaseFont bfChinese = null; try { bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); } catch (DocumentException e) { e.printStackTrace(); log.error(e.getMessage(), e); } catch (IOException e) { e.printStackTrace(); log.error(e.getMessage(), e); } Font fontChinese = new Font(bfChinese, 12, Font.NORMAL); return fontChinese; } /** * 創建pdf */ public static String createPDF(Map<String, Object> tittle, List<Object> listObj, Map<String, Object> pojectMap, String language) throws IOException, DocumentException { File file = null; try { String tmpDir = SungwsConfig.INSTANCE.getConfig().get("tmp.dir");//臨時文件夾 File tmpDirFile = new File(tmpDir); if (!tmpDirFile.exists()) { tmpDirFile.mkdir(); } String fileName = UUIDUtil.getRandomStringByLength(6).toUpperCase(); String fileUrl = tmpDir + File.separator + fileName + ".pdf"; file = new File(fileUrl); // file.createNewFile(); initDocument(file); PdfPTable table = createTable(tittle, listObj, pojectMap, language); document.add(table); System.out.println("文件創建成功: " + fileUrl); return fileUrl; } finally { if (document != null) { document.close(); } } } /** * 組裝table * * @param tittle * @param listObj * @param pojectMap * @param language * @return */ private static PdfPTable createTable(Map<String, Object> tittle, List<Object> listObj, Map<String, Object> pojectMap, String language) { System.out.println("tittle" + tittle); System.out.println("listObj" + listObj); AtomicInteger index = new AtomicInteger(1);//記錄下表數 AtomicInteger allColsSize = new AtomicInteger(0);//記錄總列數 float width = 100; float height = 40; int tittleSize = tittle.size(); PdfPTable table = createTable(tittleSize); //1 設置標題 tittle.forEach((key, value) -> { PdfPCell cell = null; //表格的單元格 if ("zh".equals(language)) { cell = createHeadCell(String.valueOf(value), textfont); } else { cell = createHeadCell(key, textfont); } table.addCell(cell); allColsSize.getAndIncrement(); }); //2 設置 內容 listObj.forEach(obj -> { if (obj instanceof List) { List<Map> comptents = (List<Map>) obj; comptents.forEach(comptent -> { Object obj1 = comptent.get("parts"); AtomicInteger rowSpan1 = new AtomicInteger(0); List<Map> parts = null; if (obj1 instanceof List && ((List) obj1).size() > 0) { //rowSpan1 需要嵌套多層 parts = (List<Map>) obj1; parts.forEach(part -> { Object obj2 = part.get("items"); if (obj2 instanceof List && ((List) obj2).size() > 0) { rowSpan1.addAndGet(((List) obj2).size()); } else { rowSpan1.addAndGet(1); } }); } else { rowSpan1.addAndGet(1); } //添加編號 PdfPCell cellNo = createCell(String.valueOf(index.getAndIncrement()), textfont, rowSpan1.get(), 1); table.addCell(cellNo); //組件 String component_name = String.valueOf(comptent.get("component_name")); PdfPCell cell1 = createCell(component_name, textfont, rowSpan1.get(), 1); table.addCell(cell1); if (parts != null) { //部件 parts.forEach(part -> { Object obj2 = part.get("items"); List<Map> items = null; int rowSpan2 = 1; if (obj2 instanceof List && ((List) obj2).size() > 0) { items = (List<Map>) obj2; rowSpan2 = items.size(); } //部件Custmization String part_name = String.valueOf(part.get("part_name")); PdfPCell cell2 = createCell(part_name, textfont, rowSpan2, 1); table.addCell(cell2); if (items != null) { //item items.forEach(item -> { //從標題的第三個key開始遍歷titile,獲取數據 Set<String> keys = tittle.keySet(); Iterator<String> iterator = keys.iterator(); iterator.next();//排除第一個NO iterator.next();//排除第二個Components iterator.next();//排除第三個Items while (iterator.hasNext()) { String key = iterator.next(); Object o = item.get(key); if (o != null) { PdfPCell cell3 = createCell(String.valueOf(o), textfont, 1, 1); table.addCell(cell3); } else { table.addCell(createBlankTable()); } } }); } else { //剩下的列沒有數據填空 for (int i = 0; i < allColsSize.get() - 3; i++) { table.addCell(createBlankTable()); } } }); } else { //剩下的列沒有數據填空 for (int i = 0; i < allColsSize.get() - 2; i++) { table.addCell(createBlankTable()); } } }); } }); //3 設置消費者信息 // table.addCell(createCell("", textfont, 1, allColsSize.get()));//中間空一行 //添加編號 PdfPCell cellNo = createCell(String.valueOf(index.getAndIncrement()), textfont, 10, 1); table.addCell(cellNo); Map<String, Object> projectTitle = (Map<String, Object>) pojectMap.get("projectTitle");//標題 Map<String, Object> projectValue = (Map<String, Object>) pojectMap.get("projectValue");//值 //項目概述 table.addCell(createCell(String.valueOf(pojectMap.get("component_name")), textfont, 1, 1)); table.addCell(createCell(String.valueOf(projectTitle.get("components_name")), textfont, 1, 1)); table.addCell(createCell(String.valueOf(projectValue.get("components_name")), textfont, 1, allColsSize.get() - 3)); table.addCell(createCell(String.valueOf(pojectMap.get("customer_inputs")), textfont, 9, 1)); table.addCell(createCell(String.valueOf(projectTitle.get("components_location")), textfont, 1, 1)); table.addCell(createCell(String.valueOf(projectValue.get("components_location")), textfont, 1, allColsSize.get() - 3)); table.addCell(createCell(String.valueOf(projectTitle.get("plant_capacity")), textfont, 1, 1)); table.addCell(createCell(String.valueOf(projectValue.get("plant_capacity")), textfont, 1, allColsSize.get() - 3)); table.addCell(createCell(String.valueOf(projectTitle.get("site_conditions")), textfont, 1, 1)); table.addCell(createCell(String.valueOf(projectValue.get("site_conditions")), textfont, 1, allColsSize.get() - 3)); table.addCell(createCell(String.valueOf(projectTitle.get("altitude")), textfont, 1, 1)); table.addCell(createCell(String.valueOf(projectValue.get("altitude")), textfont, 1, allColsSize.get() - 3)); table.addCell(createCell(String.valueOf(projectTitle.get("dc_ac_ratio")), textfont, 1, 1)); table.addCell(createCell(String.valueOf(projectValue.get("dc_ac_ratio")), textfont, 1, allColsSize.get() - 3)); table.addCell(createCell(String.valueOf(projectTitle.get("inverter_dc_input_cable")), textfont, 1, 1)); table.addCell(createCell(String.valueOf(projectValue.get("inverter_dc_input_cable")), textfont, 1, allColsSize.get() - 3)); table.addCell(createCell(String.valueOf(projectTitle.get("mv_switchgear_output_cable")), textfont, 1, 1)); table.addCell(createCell(String.valueOf(projectValue.get("mv_switchgear_output_cable")), textfont, 1, allColsSize.get() - 3)); table.addCell(createCell(String.valueOf(projectTitle.get("grid_voltage")), textfont, 1, 1)); table.addCell(createCell(String.valueOf(projectValue.get("grid_voltage")), textfont, 1, allColsSize.get() - 3)); return table; } }
關于spring-boot中怎么實現一個PDF打印功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。