精华内容
下载资源
问答
  • java生成pdf放入图片
    2022-06-12 10:37:09

    maven依赖

    < dependency>
    < groupId>net.sf.jasperreports< /groupId>
    < artifactId>jasperreports</ artifactId>
    < version>6.16.0< /version>
    < exclusions>
    < exclusion>
    < groupId>com.lowagie< /groupId>
    < artifactId>itext</ artifactId>
    < /exclusion>

    < /dependency>
    < dependency>
    < groupId>com.lowagie</ groupId>
    < artifactId>itext</ artifactId>
    < version>2.1.7</ version>
    < /dependency>

    1.下载
    官方地址:https://community.jaspersoft.com/project/jaspersoft-studio

    注册一个账号进行下载就可以了

    2.创建一个PDF模板文件

    改模板中包含 图片,静态文本,动态文本

    3.创建一个空白模板文件

    然后一直next即可

    生成如下文件

    4.向文件中填充静态文本内容
    可以先将没用的标签删除,比如title,header,footer等

    创建静态文本标签

    编辑标签内容及其样式

    5.创建动态文本内容
    首相创建三个对应的属性姓名,性别,年龄,以及imageURL

    在右侧编辑属性名以及属性类型,全部选取String类型即可

    将创建好的属性填充到动态文本标签中

    6.填充图片属性,使用图片URL地址的方式

    填充属性

    这样一个模板就创建完成了,但是为了让我们的模板更完善还需要设置以下属性

    无资源时报错

    columnWith + left + right = pageWith,这样才能够保证我们可以生成多页PDF

    6.中文乱码的解决方案
    下载字体文件,博主网盘地址

    链接:https://pan.baidu.com/s/1dbT4_0Ds4nAVbie6KGBFZg

    提取码:1ev0

    创建jasper配置文件jasperreports_extension.properties,内容如下

    net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
    net.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml ----?此处为下载完成的中文文件地址
    由于字体文件为华文宋体,所以需要将模板中所有的文本标签字体改为华文宋体

    7.编译文件

    最后将生成的jrxml文件放到resource目录下,进行单元测试
    文件结构

    @Test
    public void test122() throws IOException, JRException {
    JasperReport billComponentCardReport = JasperCompileManager.compileReport(new ClassPathResource(“Blank_A4.jrxml”).getInputStream());
    Map<String, Object> map = new HashMap<>();
    map.put(“name”, “jack”);
    map.put(“gender”, “男”);
    map.put(“age”, “12”);
    map.put(“imgAddress”, “C:\Users\admin\Desktop\aa.png”);
    List list = new ArrayList<>();
    list.add(map);
    list.add(map);
    list.add(map);
    JasperPrint jasperPrint = JasperFillManager.fillReport(billComponentCardReport, null, new JRBeanCollectionDataSource(list));
    JasperExportManager.exportReportToPdfStream(jasperPrint, new FileOutputStream(new File(“E:\cc.pdf”)));
    }
    完成

    更多相关内容
  • java 生成pdf

    2022-01-11 20:33:06
    1. 生成 pdf 文件 package com.lenovo.npi.datacenter.module.dashboard.helper; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.PageSize; import ...

    1. 生成 pdf 文件

    package com.leinovo.npi.datacenter.module.dashboard.helper;
    
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.PageSize;
    import com.itextpdf.text.Paragraph;
    import com.itextpdf.text.pdf.PdfWriter;
    import com.leinovo.npi.datacenter.report.core.model.ReportInstanceInfo;
    import com.leinovo.npi.datacenter.report.core.model.ReportProfile;
    import com.leinovo.npi.util.DateUtils;
    import com.leinovo.platform.util.JwtUtil;
    import org.apache.commons.collections.CollectionUtils;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.OutputStream;
    import java.util.Date;
    import java.util.List;
    
    /**
     * @description: CustomerPdfHelper
     * @author: leiming5
     * @date: 2021/12/30 15:12
     */
    public class CustomerPdfHelper extends DownloadHelper {
    
        public CustomerPdfHelper(ReportProfile reportProfile, ReportInstanceInfo recentlyReportInstanceInfo, HttpServletResponse response) {
            super(reportProfile, recentlyReportInstanceInfo, response);
        }
    
        /**
         * pdf 写入响应流
         * 1. 获取响应流
         * 2. 生成 pdf 文档
         * 3. 文档放入输出流
         * 4. pdf 文档 放入数据
         * 5. 关闭 pdf 文档
         *
         * @author leiming5
         */
        @Override
        public void download() {
    
            String dateString = DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN_YYYY_MM_DD_HH_MM_SS);
            response.setHeader("content-disposition", "attachment;filename=" + fileName + "_" + dateString + ".pdf");
            response.setContentType("application/octet-stream");
    
            try (OutputStream out = response.getOutputStream()) {
                // 1.新建document对象
                Document document = new Document(PageSize.A4);// 建立一个Document对象
    
                // 2.文档写入输出流
                PdfWriter.getInstance(document, out);
    
                // 3.打开文档
                document.open();
    
                // 4.向文档中添加内容
                appendDataToDocument(document);
    
                // 5.关闭文档
                document.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 将 数据放入 文档
         *
         * @param document
         */
        public void appendDataToDocument(Document document) {
    
            addDocumentProperties(document);
    
            for (int i = 0; i < elementKeys.size(); i++) {
                String elementKey = elementKeys.get(i);
                appendDataToDocumentByKey(document, elementKey);
            }
        }
    
        private void addDocumentProperties(Document document) {
            document.addTitle(fileName);// 标题
            String username = JwtUtil.getUsername();
            document.addAuthor(username);// 作者
            document.addSubject(fileName);// 主题
            document.addKeywords(fileName);// 关键字
            document.addCreator(username);// 创建者
        }
    
        private void addGraph(Document document, String word) {
            try {
                document.add(new Paragraph(word));
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 通过 报表元素 key 添加数据到 sheet
         *
         * @param document pdf 文档
         * @param excelKey 当前报表的 key
         * @return 下一个报表的起始行
         * @author leiming5
         */
        private void appendDataToDocumentByKey(Document document, String excelKey) {
            String elementTitle = getTitle(excelKey);
            List<String> elementHeader = getHeader(excelKey);
            if (CollectionUtils.isEmpty(elementHeader)) {
                return;
            }
    
            List<List<String>> elementData = getData(excelKey);
    
            DocumentHelper documentHelper = new DocumentHelper(elementTitle, elementHeader, elementData, document);
            documentHelper.appendElementToDocument(excelKey,elementTitle);
        }
    }
    
    

    2 pdf 中添加表格

    package com.leinovo.npi.datacenter.module.dashboard.helper;
    
    import com.itextpdf.text.BaseColor;
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.Element;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.FontFactory;
    import com.itextpdf.text.Image;
    import com.itextpdf.text.Paragraph;
    import com.itextpdf.text.Phrase;
    import com.itextpdf.text.pdf.PdfPCell;
    import com.itextpdf.text.pdf.PdfPTable;
    import com.leinovo.npi.datacenter.report.core.component.ProductPictureElement;
    import com.leinovo.npi.datacenter.report.core.component.SupplyProfileElement;
    import org.jfree.chart.JFreeChart;
    import org.jfree.data.category.CategoryDataset;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    
    /**
     * @description: DocumentHelper
     * @author: leiming5
     * @date: 2021/12/30 18:31
     */
    public class DocumentHelper {
        private String elementTitle;
        private List<String> elementHeader;
        private List<List<String>> elementData;
        private Document document;
    
        private static int maxWidth = 520;
        private static int titleSize = 6;
        private static int fontSize = 5;
    
        private static BaseColor whiteColor = UiHelper.getWhiteColor();
        private static BaseColor blackColor = UiHelper.getBlackColor();
        private static BaseColor greyColor = UiHelper.getGreyColor();
        private static BaseColor blueColor = UiHelper.getBlueColor();
    
        private static Font titlefont = FontFactory.getFont(FontFactory.TIMES_ROMAN, titleSize, Font.NORMAL, blackColor);
        private static Font headfont = FontFactory.getFont(FontFactory.TIMES_ROMAN, fontSize, Font.BOLD, whiteColor);
        private static Font bodyfont = FontFactory.getFont(FontFactory.TIMES_ROMAN, fontSize, Font.NORMAL, blackColor);
    
    
        public DocumentHelper(String elementTitle, List<String> elementHeader, List<List<String>> elementData, Document document) {
            this.elementTitle = elementTitle;
            this.elementHeader = elementHeader;
            this.elementData = elementData;
            this.document = document;
        }
    
        /**
         * 放入 表格、图表
         *
         * @return 下一个 报表元素的 开始index
         * @author leiming5
         */
        public void appendElementToDocument(String excelKey, String elementTitle) {
    
            appendTableToDocument();
    
            // 折线图+柱状图(同时出现;FG Demand Supply与 Material Demand Supply 动他选择)
            if (excelKey.contains(SupplyProfileElement.getECode())) {
                appendImageToDocument(excelKey, elementTitle);
                // 图片列表 Product Picture(翻页功能)
            } else if (excelKey.contains(ProductPictureElement.getECode())) {
                appendImageToDocument(excelKey, elementTitle);
            } else {
                appendImageToDocument(excelKey, elementTitle);
            }
        }
    
        /**
         * 插件无法直接生成 图表,只能通过前端生成 图标的图片,然后把连接放入 pdf
         *
         * @param excelKey element key
         * @author leiming5
         */
        private void appendImageToDocument(String excelKey, String elementTitle) {
            String chartName = excelKey + ".jpg";
            addGraph("");
    
            CategoryDataset dataset = ChartHelper.getDataset();
            JFreeChart chart = ChartHelper.getChart(dataset, elementTitle, "", "");
            ChartHelper.generateChart(chartName, chart);
    
            try {
                Image image = Image.getInstance(chartName);
                image.setAlignment(Image.ALIGN_CENTER);
                image.scalePercent(40);
                document.add(image);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (DocumentException e) {
                e.printStackTrace();
            }
    
            File file = new File(chartName);
            file.delete();
        }
    
        private void addGraph(String value) {
            try {
                document.add(new Paragraph(value));
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 1. 放入 标题
         * 2. 放入 excel 表头
         * 3. 放入 excel 数据
         * 4. 设置列的样式
         *
         * @return 下一个 报表元素的 开始index
         * @author leiming5
         */
        private void appendTableToDocument() {
            PdfPTable table = createTable(elementHeader.size());
    
            appendElementTitle(table);
            appendElementHeader(table);
            appendElementData(table);
    
            addTable(table);
        }
    
        private void addTable(PdfPTable table) {
            try {
                document.add(table);
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }
    
        private void appendElementTitle(PdfPTable table) {
            table.addCell(createTitleCell(elementTitle, elementHeader.size()));
        }
    
        private void appendElementHeader(PdfPTable table) {
            for (String fieldName : elementHeader) {
                table.addCell(createHeadCell(fieldName));
            }
        }
    
        private void appendElementData(PdfPTable table) {
    
            for (List<String> row : elementData) {
                for (String cellData : row) {
                    table.addCell(createBodyCell(cellData));
                }
            }
        }
    
    
        /**
         * 创建指定列宽、列数的表格
         *
         * @param headerSize 表头字段数量
         * @return 创建的表格
         * @author leiming5
         */
        public PdfPTable createTable(int headerSize) {
    
            float[] fieldNums = new float[headerSize];
            for (int i = 0; i < headerSize; i++) {
                fieldNums[i] = 30f;
            }
    
            PdfPTable table = new PdfPTable(fieldNums);
    
            try {
                table.setTotalWidth(maxWidth);
                table.setLockedWidth(true);
                table.setHorizontalAlignment(Element.ALIGN_CENTER);
    
                UiHelper.setDefaultCell(table.getDefaultCell());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return table;
        }
    
    
        /**
         * 创建单元格(指定字体、水平居..、单元格跨x列合并、设置单元格内边距)
         *
         * @param value
         * @param colspan
         * @return
         */
        public PdfPCell createTitleCell(String value, int colspan) {
            PdfPCell cell = new PdfPCell();
            cell.setPhrase(new Phrase(value, titlefont));
    
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell.setHorizontalAlignment(Element.ALIGN_LEFT);
            cell.setColspan(colspan);
    
            cell.setBorder(0);
    
            cell.setPadding(3.0f);
            cell.setPaddingTop(15.0f);
            cell.setPaddingBottom(8.0f);
            return cell;
        }
    
        /**
         * 创建单元格(指定字体)
         *
         * @param value
         * @return
         */
        public PdfPCell createBodyCell(String value) {
            PdfPCell cell = new PdfPCell();
            cell.setPhrase(new Phrase(value, bodyfont));
    
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setBorderColor(greyColor);
            return cell;
        }
    
        public PdfPCell createHeadCell(String value) {
            PdfPCell cell = new PdfPCell();
            cell.setPhrase(new Phrase(value, headfont));
    
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setBackgroundColor(blueColor);
            cell.setBorderColor(greyColor);
            return cell;
        }
    }
    
    

    3. pdf 放入chart

    其实,是通过 jfree生成一张图片,再将图片放入pdf

    package com.leinovo.npi.datacenter.module.dashboard.helper;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.CategoryAxis;
    import org.jfree.chart.axis.CategoryLabelPositions;
    import org.jfree.chart.axis.ValueAxis;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.title.LegendTitle;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.category.CategoryDataset;
    import org.jfree.data.category.DefaultCategoryDataset;
    
    import java.awt.*;
    import java.io.BufferedOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    /**
     * 参考连接 : https://www.cnblogs.com/antlord/p/8325937.html
     * https://blog.csdn.net/u012373815/article/details/50327907
     *
     * @description: ChartHelper
     * @author: leiming5
     * @date: 2022/1/3 14:49
     */
    public class ChartHelper {
    
        public static void generateChart(String chartName,JFreeChart chart ) {
            characterFix(chart);
            saveCharToFile(chart, chartName);
        }
    
        public static void saveCharToFile(JFreeChart chart, String fileName) {
            OutputStream out = null;
            int width = 1023;
            int height = 511;
            try {
                out = new BufferedOutputStream(new FileOutputStream(fileName));
                if (fileName.endsWith("png")) {
                    ChartUtilities.writeChartAsPNG(out, chart, width, height);
                } else {
                    ChartUtilities.writeChartAsJPEG(out, 1.0f, chart, width, height, null);
                }
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        public static CategoryDataset getDataset() {
            DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            dataset.addValue(1310, "plan", "PEL Exit");
            dataset.addValue(720.68, "plan", "POR Exit");
            dataset.addValue(675.3, "plan", "TR");
            dataset.addValue(560, "plan", "EVT Start");
            dataset.addValue(680.88, "plan", "DVT1 Start");
            dataset.addValue(780, "plan", "DVT2 Start");
            dataset.addValue(13100, "actual", "PEL Exit");
            dataset.addValue(720.680, "actual", "POR Exit");
            dataset.addValue(6750.3, "actual", "TR");
            dataset.addValue(5600, "actual", "EVT Start");
            dataset.addValue(680.88, "actual", "DVT1 Start");
            dataset.addValue(7800, "actual", "DVT2 Start");
    
            return dataset;
        }
    
        public static JFreeChart getChart(CategoryDataset dataset, String title, String yAxisName, String xAxisName) {
            JFreeChart chart = ChartFactory.createLineChart(
    //      JFreeChart chart = ChartFactory.createBarChart3D(
                    title,// 图形名称
                    xAxisName,// 分类名称,为横坐标名称
                    yAxisName,// 值名称,为纵坐标名称
                    dataset,// 数据集合
                    PlotOrientation.VERTICAL,// 垂直显示
                    true,// 是否显示图例
                    false,// 是否使用工具提示
                    false);// 是否使用url
            return chart;
        }
    
        public static void characterFix(JFreeChart chart) {
            // 配置字体
            Font xfont = new Font("宋体", Font.PLAIN, 12);// X轴
            Font yfont = new Font("宋体", Font.PLAIN, 12);// Y轴
            Font kfont = new Font("宋体", Font.PLAIN, 12);// 底部
            Font titleFont = new Font("宋体", Font.BOLD, 15); // 图片标题
    
            // 图形的绘制结构对象,对于饼图不适用
            CategoryPlot plot = chart.getCategoryPlot();
    
            // 图片标题
            chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));
    
            // 底部
            LegendTitle legendTitle = chart.getLegend();
            if (legendTitle != null) {
                legendTitle.setItemFont(kfont);
            }
    
            // X 轴
            CategoryAxis domainAxis = plot.getDomainAxis();
            domainAxis.setLabelFont(xfont);// 轴标题
            domainAxis.setTickLabelFont(xfont);// 轴数值
            domainAxis.setTickLabelPaint(Color.BLUE); // 字体颜色
            domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
    
            // Y 轴
            ValueAxis rangeAxis = plot.getRangeAxis();
            rangeAxis.setLabelFont(yfont);
            rangeAxis.setLabelPaint(Color.BLUE); // 字体颜色
            rangeAxis.setTickLabelFont(yfont);
        }
    
    }
    
    

    4. 字体等样式

    package com.leinovo.npi.datacenter.module.dashboard.helper;
    
    import com.itextpdf.text.BaseColor;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.FontFactory;
    import com.itextpdf.text.Phrase;
    import com.itextpdf.text.pdf.PdfPCell;
    
    /**
     * @description: UiHelper
     * @author: leiming5
     * @date: 2021/12/31 11:20
     */
    public final class UiHelper {
    
    
        public static void setDefaultCell(PdfPCell cell) {
            // 大小
            cell.setFixedHeight(14);
    
            // 边框
            cell.setBorder(1);
            cell.setBorderWidth(1);
            cell.setBorderColor(getBorderColor());
    
            // 字体,字体的样式、COLOR
            cell.addElement(getPhrase("second content"));
    
            // 背景
            cell.setBackgroundColor(getBlueColor());
        }
    
        /**
         * 短语
         *
         * @return
         */
        public static Phrase getPhrase(String content) {
            Phrase phrase = new Phrase();
            phrase.setFont(getDefaultFont());
            phrase.setLeading(12);// 行距
            phrase.add(content);
    
            return phrase;
        }
    
        /**
         * 设置字体
         * 有四种属性(字体,字号,字型,颜色)
         */
        public static Font getFont(int size, BaseColor color) {
    
            return FontFactory.getFont(FontFactory.TIMES_ROMAN, size, Font.NORMAL, color);
        }
    
        public static Font getDefaultFont() {
    
            return getFont(8, getBlackColor());
        }
    
        /**
         * 边框颜色
         */
        public static BaseColor getBorderColor() {
            return new BaseColor(231, 237, 243);
        }
    
        /**
         * 白色 表头字体,body背景
         */
        public static BaseColor getWhiteColor() {
            return new BaseColor(255, 255, 255);
        }
    
        /**
         * 蓝色 表头背景
         */
        public static BaseColor getBlueColor() {
            return new BaseColor(88, 135, 227);
        }
    
        /**
         * 黑色 body 字体颜色
         */
        public static BaseColor getBlackColor() {
            return new BaseColor(34, 34, 34);
        }
    
        /**
         * 灰色 body 背景颜色
         */
        public static BaseColor getGreyColor() {
            return new BaseColor(217, 226, 243);
        }
    }
    
    
    展开全文
  • PDF文件生成图片 实现功能 根据上传的PDF文件,生成图片文件, 单页PDF,生成图片文件. 多页PDF,则生成zip压缩包. 一 : 文件生成效果 二 : 引入所需maven依赖 项目采用springboot框架 <!-- PDF图片 --> &...

    PDF文件生成图片

    实现功能

    根据上传的PDF文件,生成图片文件,
    单页PDF,生成图片文件.
    多页PDF,则生成zip压缩包.
    

    一 : 文件生成效果

    单页PDF文件
    多页PDF文件

    二 : 引入所需maven依赖

    项目采用springboot框架

    	<!-- PDF转图片 -->
        <dependency>
            <groupId>org.icepdf.os</groupId>
            <artifactId>icepdf-core</artifactId>
            <version>6.2.2</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.media</groupId>
                    <artifactId>jai_core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    

    三 : JAVA代码工具类

    生成图片工具类 PdfToImageUtil.java

    package com.util;
    
    import com.lowagie.text.pdf.PdfReader;
    import lombok.extern.slf4j.Slf4j;
    import org.icepdf.core.pobjects.Document;
    import org.icepdf.core.pobjects.Page;
    import org.icepdf.core.util.GraphicsRenderingHints;
    import org.springframework.web.multipart.MultipartFile;
    import javax.imageio.ImageIO;
    import javax.servlet.http.HttpServletResponse;
    import java.awt.image.BufferedImage;
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    @Slf4j
    public class PdfToImageUtil {
    
        //支持文件格式
        public static final String SUPPORT_FILE = "pdf";
        //图片文件格式
        public static final String IMAGE_SUFFIX = "jpg"; //png
        //压缩文件格式
        public static final String ZIP_SUFFIX = "zip";
        //PDF是否为一页
        private static boolean isImage;
    
        /**
         * 对外的开放接口,用于将PDF文件转换为图片文件压缩包进行下载
         * @param file SpringMVC获取的图片文件
         */
        public static synchronized void pdfToTransformation(MultipartFile file, HttpServletResponse response) throws Exception {
            String fileName = file.getOriginalFilename();
            if(null == fileName) return;
            String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
            log.info("文件名称:" + fileName + ",文件后缀:" + suffix);
            if(!SUPPORT_FILE.equals(suffix)) return;
            isImage = false;
            File imageFile = generateFile(file);
            log.info("文件生成成功!");
            downloadFile(imageFile, response);
        }
    
        /**
         * 将PDF文件转换为多张图片并放入一个压缩包中
         * @param file SpringMVC获取的图片文件
         * @return 图片文件压缩包
         * @throws Exception 抛出异常
         */
        private static File generateFile(MultipartFile file) throws Exception {
            String fileName = file.getOriginalFilename();
            if(null == fileName) return null;
            Document document = new Document();
            document.setByteArray(file.getBytes(), 0, file.getBytes().length, fileName);
            log.info("PDF页数:" + document.getNumberOfPages());
            isImage = 1 == document.getNumberOfPages();
            File imageReturnFile = null;
            List<File> fileList = new ArrayList<>();
            for (int i = 0; i < document.getNumberOfPages(); i++) {
                BufferedImage image = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN,
                        Page.BOUNDARY_CROPBOX, 0F, 2.5F);
                File imageFile = new File((i + 1) + "." + IMAGE_SUFFIX);
                ImageIO.write(image, IMAGE_SUFFIX, imageFile);
                image.flush();
                if(isImage){
                    imageReturnFile = imageFile;
                    break;
                }
                fileList.add(imageFile);
            }
            document.dispose();
            if(isImage) return imageReturnFile;
            //压缩图片文件
            String directoryName = fileName.substring(0, fileName.lastIndexOf("."));
            File zipFile = new File(directoryName + "." + ZIP_SUFFIX);
            ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFile));
            zipFile(fileList, zipOutputStream);
            zipOutputStream.close();
            return zipFile;
        }
    
        /**
         * 下载image/zip文件
         * @param downloadFile 文件
         * @param response HttpServletResponse
         * @throws IOException IO异常
         */
        private static void downloadFile(File downloadFile, HttpServletResponse response) throws IOException {
            FileInputStream fileInputStream = new FileInputStream(downloadFile);
            byte[] bytes = new byte[fileInputStream.available()];
            fileInputStream.read(bytes);
            fileInputStream.close();
            //设置response参数
            response.reset();
            if(isImage){
                response.setContentType("image/jpeg");
            } else {
                response.setContentType("application/zip");
            }
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(downloadFile.getName(), "UTF-8"));
            OutputStream outputStream = response.getOutputStream();
            outputStream.write(bytes);
            outputStream.flush();
            outputStream.close();
            if(!isImage) downloadFile.delete();
        }
    
        /**
         * 压缩文件
         * @param inputFiles 具体需要压缩的文件集合
         * @param zipOutputStream ZipOutputStream对象
         * @throws IOException IO异常
         */
        private static void zipFile(List<File> inputFiles, ZipOutputStream zipOutputStream) throws IOException {
            byte[] buffer = new byte[1024];
            for (File file : inputFiles) {
                if (file.exists()) {
                    if (file.isFile()) {
                        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
                        zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
                        int size = 0;
                        while ((size = bis.read(buffer)) > 0) {
                            zipOutputStream.write(buffer, 0, size);
                        }
                        zipOutputStream.closeEntry();
                        bis.close();
                        file.delete();
                    } else {
                        File[] files = file.listFiles();
                        if(null == files) continue;
                        List<File> childrenFileList = Arrays.asList(files);
                        zipFile(childrenFileList, zipOutputStream);
                    }
                }
            }
        }
    
        /**
         * 获取PDF页数
         * @throws IOException
         */
        public static String getPdfPageSize(MultipartFile file) throws IOException {
            PdfReader pdfReader = new PdfReader(file.getBytes());
            int pages = pdfReader.getNumberOfPages();
            return String.valueOf(pages);
        }
    }
    
    

    生成图片PdfController.java

    package com.web.transformation.controller;
    
    import com.util.PdfToImageUtil;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.multipart.MultipartFile;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @Controller
    public class PdfController {
    
        //PDF转图片或者ZIP
        @RequestMapping("/pdfToImage")
        @ResponseBody
        public void pdfToImage(MultipartFile file, HttpServletResponse response) throws Exception{
            PdfToImageUtil.pdfToTransformation(file,response);
        }
    
        //获取PDF页数
        @RequestMapping("/getPdfPageSize")
        @ResponseBody
        public String pdfToImage(MultipartFile file) throws IOException {
            return PdfToImageUtil.getPdfPageSize(file);
        }
    
    }
    

    四 : 说明

    生成的图片文件格式,可手动修改,此处设置为jpg,也可设置为png
    也可将该配置,放置在yml配置文件中
    在这里插入图片描述

    展开全文
  • 使用Java生成PDF文件

    千次阅读 热门讨论 2022-03-09 08:56:11
    java使用itext生成pdf,直接执行main方法可用!!

    最近遇到一个需求,需要使用Java生成PDF文件,网上的资料很杂乱,故整理记录一下

    首先引入pom依赖

    <!-- pdf:start -->
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itextpdf</artifactId>
                <version>5.5.11</version>
            </dependency>
            <dependency>
                <groupId>com.itextpdf.tool</groupId>
                <artifactId>xmlworker</artifactId>
                <version>5.5.11</version>
            </dependency>
            <!-- 支持中文 -->
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itext-asian</artifactId>
                <version>5.2.0</version>
            </dependency>
            <!-- 支持css样式渲染 -->
            <dependency>
                <groupId>org.xhtmlrenderer</groupId>
                <artifactId>flying-saucer-pdf-itext5</artifactId>
                <version>9.1.16</version>
            </dependency>
            <!-- 转换html为标准xhtml包 -->
            <dependency>
                <groupId>net.sf.jtidy</groupId>
                <artifactId>jtidy</artifactId>
                <version>r938</version>
            </dependency>
    <!-- pdf:end -->

    将生成代码PDF的工具类放入项目中

    package com.seezoon.admin.framework.utils;
    
    import com.itextpdf.text.pdf.BaseFont;
    import com.seezoon.admin.framework.utils.bean.ContractDynamicParam;
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import org.xhtmlrenderer.pdf.ITextRenderer;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.util.Map;
    
    /**
     * @Description: 生成PDF合同工具类
     * @author liguodong
     * @date 2022年3月6日 下午5:19:32
     */
    public class GeneratePdfUtil {
    
    	//private static final String TEMPORARY_CONTRACT_HTML = "E:\\workspace\\dytc\\dytc\\seezoon-admin-server\\src\\main\\resources\\contract\\temporary.html";// 临时HTML合同,用于转PDF格式
    	private static final String TEMPORARY_CONTRACT_HTML = "/data/file/contract/temporary.html";
    	//private static final String SIMSUM_FILE = "E:\\workspace\\dytc\\dytc\\seezoon-admin-server\\src\\main\\resources\\common\\simsun.ttc";// 添加字体,解决中文支持问题
    	private static final String SIMSUM_FILE = "/data/file/common/simsun.ttc";
    
    
    	public static String GenerateContract(ContractDynamicParam param) throws Exception {
    		// 生成html合同
    		generateHTML(param.getTemplatePath(), param.getTemplateName(), param.getContractParam());
    		// 根据html合同生成pdf合同
    		generatePDF(param.getContractPath() + param.getContractName());
    		// 删除临时html格式合同
    		removeFile(TEMPORARY_CONTRACT_HTML);
    		return param.getContractPath() + param.getContractName();
    	}
    
    	/**
    	 * @Description 生成html格式合同
    	 */
    	private static void generateHTML(String templatePath, String templateName, Map<String, Object> paramMap) throws Exception {
    
    		Configuration cfg = new Configuration();
    		cfg.setDefaultEncoding("UTF-8");
    		/**
    		 * 1.setClassForTemplateLoading(this.getClass(), "/HttpWeb");
    		 * 基于类路径,HttpWeb包下的framemaker.ftl文件
    		 * 2.setDirectoryForTemplateLoading(new File("/template"));
    		 * 基于文件系统,template目录下的文件
    		 * 3.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/template");
    		 * 基于Servlet Context,指的是基于WebRoot下的template下的framemaker.ftl文件
    		 */
    		cfg.setDirectoryForTemplateLoading(new File(templatePath));
    
    		// templateName.ftl为要装载的模板
    		Template template = cfg.getTemplate(templateName);
    
    		File outHtmFile = new File(TEMPORARY_CONTRACT_HTML);
    
    		Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outHtmFile)));
    		// 将参数输出到模版,并操作到HTML上
    		template.process(paramMap, out);
    		out.close();
    	}
    
    	/**
    	 * @Description 根据html生成pdf格式合同
    	 */
    	private static void generatePDF(String pdfUrl) throws Exception {
    		File htmFile = new File(TEMPORARY_CONTRACT_HTML);
    		File pdfFile = new File(pdfUrl);
    		System.out.println(pdfUrl);
    		String url = htmFile.toURI().toURL().toString();
    		OutputStream os = new FileOutputStream(pdfFile);
    		ITextRenderer renderer = new ITextRenderer();
    		renderer.setDocument(url);
    		org.xhtmlrenderer.pdf.ITextFontResolver fontResolver = renderer.getFontResolver();
    		// 解决中文支持问题
    		fontResolver.addFont(SIMSUM_FILE, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    		renderer.layout();
    		renderer.createPDF(os);
    		os.close();
    	}
    
    	/**
    	 * @Description 移除文件
    	 */
    	private static void removeFile(String fileUrl) {
    		File file = new File(fileUrl);
    		file.delete();
    	}
    
    	public static void returnPdfStream(HttpServletResponse response, String pathName) throws Exception {
    		response.setContentType("application/pdf");
    
    		File file = new File(pathName);
    		if (file.exists()) {
    			FileInputStream in = new FileInputStream(file);
    			OutputStream out = response.getOutputStream();
    			byte[] b = new byte[1024 * 5];
    			int n;
    			while ((n = in.read(b)) != -1) {
    				out.write(b, 0, n);
    			}
    			out.flush();
    			in.close();
    			out.close();
    		}
    	}
    }
    
    package com.seezoon.admin.framework.utils.bean;
    
    import lombok.Data;
    
    import java.util.Map;
    
    /**
     * @Description: 生成PDF参数
     * @author lgd
     * @date 2022年4月27日 下午6:04:56
     */
    @Data
    public class ContractDynamicParam {
    	private String templatePath;// 模版路径
    	private String templateName;// 模板文件名(.ftl结尾)
    	private String contractPath;// 合同生成路径
    	private String contractName;// 合同生成文件名(.pdf结尾)
    	private Map<String, Object> contractParam;// 合同所需参数
    
    
    	public ContractDynamicParam(String templatePath, String templateName, String contractPath, String contractName, Map<String, Object> contractParam) {
    		this.templatePath = templatePath;
    		this.templateName = templateName;
    		this.contractPath = contractPath;
    		this.contractName = contractName;
    		this.contractParam = contractParam;
    	}
    
    }
    

    工具类中配置了项目的路径,一个是临时模板,另一个是字体,需要放入相应的路径下,临时模板不用建,项目会自动生成,字体需要进行引入

    配置相应的模板!!!重点

    先使用world画出模板的表格,我这边使用的是office 2019,然后转化为HTML格式

    转化的链接Word转HTML——免费在线Word转网页 (docpe.com)

    将转化的html后缀修改为ftl格式,并且在插入值得地方用${值}表示

    注意!!!

    我这边遇到了一个font-family字体无法转化的bug,修改方法是将项目中的所有的font-family用空格替换掉

    然后调用main方法进行测试

    public static void main(String[] args) throws Exception {
    		Map<String, Object> paramMap = new HashMap<String, Object>();
    		paramMap.put("XM", "張三冯");
    		paramMap.put("AH", "(2015)****字第0***0号");
    		paramMap.put("CSKSRQ", "2016年10月31日00时00分");
    		paramMap.put("KHZH", "271**********07279975");
    		paramMap.put("FYMC", "****人民法院");
    		paramMap.put("JSRQ", "2017-06-14");
    		paramMap.put("KZZT", "1");
    		paramMap.put("LCZH", "987234234");
    		paramMap.put("DATE", "2017年03月24日09时39分");
    		paramMap.put("CKWH", "(2015)*****字第0**20-1**0号裁定书");
    		paramMap.put("SKSE", "100");
    		paramMap.put("CSJSRQ", "2016年10月31日 00时00分");
    		paramMap.put("KHWD", "images/stamp.jpg");
    		ContractDynamicParam param = new ContractDynamicParam(TEMPLATES_PATH, "pdfDemo.ftl", CONTRACT_PATH, "pdfDemo5.pdf", paramMap);
    		GeneratePdfUtil.GenerateContract(param);
    		System.out.println("====test生成PDF合同成功====");
    	}

    至此就完成了,以后有空会补充一下具体细节

    有需要demo的可以移步链接去下载

    java使用itext生成pdfdemo,直接执行main方法可用!代码文档中有配置文件的详细介绍-Java文档类资源-CSDN下载java使用itext导出pdf,可以生成表格、文字、图片等,demo中详细介绍了使用的版本,可能出更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/enhengguodong/85007061

    展开全文
  • Java PDF工具类(一)| 使用 itextpdf 根据设置好的PDF模板填充PDF(文字和图片)相关文章: Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文字/图片/页眉页脚).参考文章:...
  • Java:pdf文件中添加图片

    千次阅读 2021-11-17 09:24:47
    包中的类,可以轻松实现pdf文件与图片的合成。比如要在pdf文件中添加水印、签名、盖章。下面以一个简单的main方法实现: public static void main(String[] args) throws Exception{ //pdf文件存放在E盘 File ...
  • 首先要使用到Adobe Acrobat Pro生成pdf模板(表单) /** * @param sourceFile 原模板文件 * @param targetFile 动态输入写入的文件 * @param fieldMap 动态数据值 **/ private static File toPdf(String source...
  • javaPDF签名签章demo

    2018-11-23 13:43:33
    java使用itext对PDF进行签名签章。包括:java创建PDF文档,javaPDF进行加水印,javaPDF图片水印。javaPDF进行签章。java读取p12秘钥库中证书对PDF进行签章加密。
  • 将Excel表格转为base64字符串,放入json,传给前端 前端获取json中的文件字符串,开启下载 关键代码 前端请求及返回处理 导出按钮 <el-button type="success" icon="el-icon-download" @click="downloaddata">...
  • java实现pdf的生成下载打印,java生成pdf电子账单,java生成pdf合同模板,Itext编辑pdf,java使用itext
  • Java实现PDF动态插入图片复选框

    千次阅读 2021-04-24 14:07:26
    构建PDF模板,对其中部分数据实现动态插入,主要分为三个组件:普通文本,复选框,二维码图片的动态插入 (二)制作模板 因为PDF常用的软件不让支持编辑,我们就先使用WPS以Word的形式进行编辑制作出与客户需求一样...
  • Java读取pdf模板,并动态生成pdf文件,如动态生成准考证 ​ 前几天遇到了一个生成准考证的需求,并提供用户下载,然后百度了一圈还是觉得使用itextpdf这个框架好用点。但是还需要找到一个能创建pdf表单的工具来生成...
  • 2、后台生成PDF的方案比较少,怎么保证样式,同时要有可维护性 解决方案: 1、直接生成PDF局限性较大,可以先生成word,再转PDF 2、寻找一个工具,可以把ECharts转成图片,插入到word中 三、实现 这里我以生成一个...
  • Java 使用itext 生成pdf 并将pdf打成压缩包提供下载 附源代码
  • 抓住这个项目中的khs-report-writer-XXjar并放入您的课程路径 或使用Maven 使用以下mvn命令下载并安装 mvn install 并将以下特权添加到您的POM.xml中 <groupId>com.keyholesoftware</groupId> <artifactId>khs...
  • 条码的应用已深入生活和工作的方方面面...实现功能的大致思路:生成条形码,将条形码保存为图片,然后在PDF中的表格单元格中插入条码图片。Spire.PDF for Java 中的Spire.Pdf.Barcode Package提供了多种Barcode类型,可
  • java使用itext生成表格pdf文件

    千次阅读 2022-03-26 12:59:40
    java使用itext生成表格pdf文件
  • 一、业务需求 ...为流水号生成条码或二维码,批量存放到一个pdf文件中,并在前端显示。 二、思路 1.获取需要生成条码或二维码的数据 2.生成条码或二维码 3.存放到pdf文件中 4.输出到前端页面 三、参考资料 ...
  • 本文主要介绍了java原装代码完成pdf在线预览和pdf打印及下载的方法,具有一定的参考价值,下面跟着小编一起来看下吧
  • JAVA根据模板生成PDF文件并导出

    千次阅读 热门讨论 2020-01-10 14:31:09
    根据模板生成PDF文件,模板文件参数可配,可手动修改. 一 : PDF导出效果 先看一下导出的demo文件,具体样式可手动修改 下图为demo_pdf.ftl导出PDF文件 下图为list_pdf.ftl导出PDF文件 二 : 编写PDF模板 PDF...
  • Java根据关键字在PDF/Word插入图片

    千次阅读 2022-01-28 11:51:03
    pdf/word中,根据定义的关键字标识,进行插入图片
  • 由于最近项目需要在java后台生成echarts图片,花时间研究了下这个,顺便分享下;1.首先需要先下载echarts本地服务器;(1)网盘:链接:https://pan.baidu.com/s/1kTZ9JWsU48PTTG809HurRA提取码:b69t(2)获取后放入本地...
  • } /** *生成图片二维码 * @param url 存放地址 * @param content 二维码的内容 * @param width * @param height * @return * @throws Exception */ public String code(String url, String content, ...
  • java生成二维码

    2019-03-20 20:26:04
    java生成二维码,操作简单,下载即可使用,不需要其他依赖
  • Java后端生成Echarts并渲染Word转PDF

    千次阅读 2021-09-01 18:07:07
    itext7是一款用于生成PDF文档的一个java类库,通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 网上资料比较少, 可以通过写段落/图片/表格,也可以定制pdf模板然后通过填充域属性值,...
  • JAVA根据模板生成PDF文件并导出 java将字符串按照指定长度分割成字符串数组 感谢上述博主大大,救我一命~~~ 我的系统环境:win10、IDEA、jdk1.8 一、Adobe Acrobat DC的下载 百度链接:链接:...
  • JAVA用.ftl模板文件生成PDF

    千次阅读 2020-09-07 17:07:44
    解决思路:可以先写一个.ftl模板文件(其实也就是一个html页面),然后预留对应的字段放入map中进行替换(其中data11....都是要替换的) 注: Freemarker是一个模板框架,主要是为了加快染速度而产生的。它与web...
  • java面试宝典pdf

    2022-04-06 09:12:16
    java面试宝典,java知识总结
  • 前段时间猫哥实现了用Java生成Excel文件,并以ByteArrayOutputStream的形式传输至JavaMail附件中。在这里再整理一下生成pdf文件并同样以ByteArrayOutputStream的形式传输至JavaMail附件中的方法。 其中,最主要的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,639
精华内容 5,055
关键字:

java生成pdf放入图片