千家信息网

spring-boot中怎么实现一个PDF打印功能

发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章将为大家详细讲解有关spring-boot中怎么实现一个PDF打印功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.导入jar(一定要注意
千家信息网最后更新 2025年02月06日spring-boot中怎么实现一个PDF打印功能

这篇文章将为大家详细讲解有关spring-boot中怎么实现一个PDF打印功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1.导入jar(一定要注意版本,踩过很多坑)

                    com.itextpdf            itextpdf            5.5.1                                    com.itextpdf            itext-asian            5.2.0        

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工具类) **/@Log4j2public 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 tittle, List listObj, Map 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 tittle, List listObj, Map 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 comptents = (List) obj;                comptents.forEach(comptent -> {                    Object obj1 = comptent.get("parts");                    AtomicInteger rowSpan1 = new AtomicInteger(0);                    List parts = null;                    if (obj1 instanceof List && ((List) obj1).size() > 0) {                        //rowSpan1 需要嵌套多层                        parts = (List) 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 items = null;                            int rowSpan2 = 1;                            if (obj2 instanceof List && ((List) obj2).size() > 0) {                                items = (List) 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 keys = tittle.keySet();                                    Iterator 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 projectTitle = (Map) pojectMap.get("projectTitle");//标题        Map projectValue = (Map) 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打印功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

0