栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 生成pdf

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 生成pdf

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;


public class CustomerPdfHelper extends DownloadHelper {

    public CustomerPdfHelper(ReportProfile reportProfile, ReportInstanceInfo recentlyReportInstanceInfo, HttpServletResponse response) {
        super(reportProfile, recentlyReportInstanceInfo, response);
    }

    
    @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();
        }

    }

    
    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();
        }
    }

    
    private void appendDataTodocumentByKey(document document, String excelKey) {
        String elementTitle = getTitle(excelKey);
        List elementHeader = getHeader(excelKey);
        if (CollectionUtils.isEmpty(elementHeader)) {
            return;
        }

        List> 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;


public class documentHelper {
    private String elementTitle;
    private List elementHeader;
    private List> 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 elementHeader, List> elementData, document document) {
        this.elementTitle = elementTitle;
        this.elementHeader = elementHeader;
        this.elementData = elementData;
        this.document = document;
    }

    
    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);
        }
    }

    
    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();
        }
    }

    
    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 row : elementData) {
            for (String cellData : row) {
                table.addCell(createBodyCell(cellData));
            }
        }
    }


    
    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;
    }


    
    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;
    }

    
    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;


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;


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());
    }

    
    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);
    }

    
    public static baseColor getWhiteColor() {
        return new baseColor(255, 255, 255);
    }

    
    public static baseColor getBlueColor() {
        return new baseColor(88, 135, 227);
    }

    
    public static baseColor getBlackColor() {
        return new baseColor(34, 34, 34);
    }

    
    public static baseColor getGreyColor() {
        return new baseColor(217, 226, 243);
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703995.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号