java导出pdf

JAVA实现导出pdf

在某些场景中,我们需要从数据库或其他来源获取的数据信息,动态的导出Pdf文件,如准考证的打印等。这时我们需要借助第三方依赖包—itextpdf 来实现此需求。

一、制作PDF模板

1.因为PDF常用的软件不支持编辑,所以先用Word工具,如WPS或者Office新建一个空白Word文档,里面制作出自己想要的样式。
2、将Word转换成PDF形式
3、编辑PDF准备表单
用==Adobe Acrobat DC ==软件打开保存好的PDF模板文件,点击右下角的更多工具按钮
在这里插入图片描述
进入到此页面,点击“准备表单”按钮
在这里插入图片描述
接下来进行详细的配置数据源(注意,配置的数据源字段必须与Java中的实体类对象的字段名保持一致)

另外注意:在要显示图像的区域,点击鼠标右键,选择文本域,设定好图像的显示位置,并指定数据源字段

在这里插入图片描述
配置完成之后保存,留作模板使用。

二、编写代码

1、导入依赖

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13</version>
</dependency>

2.实现类
里面写自己的表单实体类

import lombok.Data;

@Data
public class AdmissionCard {

    /**
     * 准考证号
     */
    private String no;
    /**
     * 考生姓名
     */
    private String name;
    /**
     * 考生性别
     */
    private String sex;
    /**
     * 身份证号
     */
    private String idCard;
    /**
     * 学习工作单位
     */
    private String school;
    /**
     * 报考单位
     */
    private String enterSchool;
    /**
     * 报考专业
     */
    private String major;
    /**
     * 报考点
     */
    private String enterName;
    /**
     * 考试地点
     */
    private String examAddress;
    /**
     * 考生头像
     */
    private String studentImg;
}

3、Service层代码的实现


public interface PdfCustomService {

    /**
     * 生成准考证PDF
     * @param admissionCard 准考证信息
     * @param response 响应
     */
    void generatorAdmissionCard(AdmissionCard admissionCard, HttpServletResponse response) throws UnsupportedEncodingException, FileNotFoundException;
}

import cn.ecut.file.pdf.entity.AdmissionCard;
import cn.ecut.file.pdf.service.PdfCustomService;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

/**
 * @since 2021/7/11 16:12
 */
@Service
@Slf4j
public class PdfCustomServiceImpl implements PdfCustomService {


    @Override
    public void generatorAdmissionCard(AdmissionCard admissionCard, HttpServletResponse response) throws UnsupportedEncodingException, FileNotFoundException {
        // 模板名称
        String templateName = "准考证-模板.pdf";
        String path = "";
        // 获取操作系统名称,根据系统名称确定模板存放的路径
        String systemName = System.getProperty("os.name");
        if(systemName.toUpperCase().startsWith("WIN")){
            path = "D:/pdf/";
        }else {
            path = "/usr/local/pdf/";
        }
        // 生成导出PDF的文件名称
        String fileName = admissionCard.getName() + "-硕士准考证.pdf";
        fileName = URLEncoder.encode(fileName, "UTF-8");
        // 设置响应头
        response.setContentType("application/force-download");
        response.setHeader("Content-Disposition",
                "attachment;fileName=" + fileName);
        OutputStream out = null;
        ByteArrayOutputStream bos = null;
        PdfStamper stamper = null;
        PdfReader reader = null;
        try {
            // 保存到本地
            // out = new FileOutputStream(fileName);
            // 输出到浏览器端
            out = response.getOutputStream();
            // 读取PDF模板表单
            reader = new PdfReader(path + templateName);
            // 字节数组流,用来缓存文件流
            bos = new ByteArrayOutputStream();
            // 根据模板表单生成一个新的PDF
            stamper = new PdfStamper(reader, bos);
            // 获取新生成的PDF表单
            AcroFields form = stamper.getAcroFields();
            // 给表单生成中文字体,这里采用系统字体,不设置的话,中文显示会有问题
            BaseFont font = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            form.addSubstitutionFont(font);
            // 装配数据
            Map<String, Object> data = new HashMap<>(15);
            data.put("no", admissionCard.getNo());
            data.put("name", admissionCard.getName());
            data.put("sex", admissionCard.getSex());
            data.put("idCard", admissionCard.getIdCard());
            data.put("school", admissionCard.getSchool());
            data.put("enterSchool", admissionCard.getEnterSchool());
            data.put("examAddress", admissionCard.getExamAddress());
            data.put("major", admissionCard.getMajor());
            data.put("enterName", admissionCard.getEnterName());
            data.put("studentImg", admissionCard.getStudentImg());
            // 遍历data,给pdf表单赋值
            for(String key : data.keySet()){
                // 图片要单独处理
                if("studentImg".equals(key)){
                    int pageNo = form.getFieldPositions(key).get(0).page;
                    Rectangle signRect = form.getFieldPositions(key).get(0).position;
                    float x = signRect.getLeft();
                    float y = signRect.getBottom();
                    String studentImage = data.get(key).toString();
                    //根据路径或Url读取图片
                    Image image = Image.getInstance(studentImage);
                    //获取图片页面
                    PdfContentByte under = stamper.getOverContent(pageNo);
                    //图片大小自适应
                    image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                    //添加图片
                    image.setAbsolutePosition(x, y);
                    under.addImage(image);
                }
                // 设置普通文本数据
                else {
                    form.setField(key, data.get(key).toString());
                }
            }
            // 表明该PDF不可修改
            stamper.setFormFlattening(true);
            // 关闭资源
            stamper.close();
            // 将ByteArray字节数组中的流输出到out中(即输出到浏览器)
            Document doc = new Document();
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
            copy.addPage(importPage);
            doc.close();
            log.info("*****************************PDF导出成功*********************************");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if (out != null) {
                    out.flush();
                    out.close();
                }
                if (reader != null) {
                    reader.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

4、Controller层的实现

import cn.ecut.file.pdf.entity.AdmissionCard;
import cn.ecut.file.pdf.service.PdfCustomService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;

/**
 * @since 2021/7/11 16:39
 */
@RestController
@Api(value = "PDF相关操作接口", tags = "PDF相关操作接口")
@RequestMapping("/pdf")
public class PdfController {

    @Autowired
    private PdfCustomService pdfCustomService;

    @ApiOperation(value = "导出PDF")
    @PostMapping("/admissioncard")
    public void generatorAdmissionCard(@RequestBody AdmissionCard admissionCard, HttpServletResponse response){
        try {
            pdfCustomService.generatorAdmissionCard(admissionCard, response);
        } catch (UnsupportedEncodingException | FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

最后自己进行测试即可

要在Java导出PDF文件,你可以使用一些开源库和框架来实现。以下是一种常见的方法: 1. 首先,你需要添加相关的依赖项到你的项目中。一个常用的Java库是 Apache PDFBox,它提供了创建和操作PDF文件的功能。你可以在你的构建工具中添加以下依赖项: ```xml <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.26</version> </dependency> ``` 2. 创建一个PDF文档对象,并添加内容到文档中。下面是一个简单的示例代码: ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.PDPageContentStream; import java.io.File; import java.io.IOException; public class PDFExporter { public static void main(String[] args) { try { // 创建一个新的PDF文档 PDDocument document = new PDDocument(); // 添加一个页面 PDPage page = new PDPage(PDRectangle.A4); document.addPage(page); // 创建页面内容流 PDPageContentStream contentStream = new PDPageContentStream(document, page); // 添加文本到页面 contentStream.beginText(); contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12); contentStream.newLineAtOffset(100, 700); contentStream.showText("Hello, World!"); contentStream.endText(); // 关闭流并保存文档 contentStream.close(); document.save(new File("output.pdf")); // 关闭文档 document.close(); System.out.println("PDF导出完成!"); } catch (IOException e) { e.printStackTrace(); } } } ``` 上述代码将创建一个包含 "Hello, World!" 文本的PDF文件。你可以根据自己的需求修改代码来添加更多内容和样式。 3. 运行代码,你将在项目的根目录下找到名为 "output.pdf" 的PDF文件,它就是导出PDF文档。 这只是一个简单的示例,你可以根据实际需求进行更复杂的PDF操作。希望能帮到你!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KYGALYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值