Java使用itextpdf7生成pdf文档

使用itextpdf7生成pdf文档,首先需要导入itextpdf7相关依赖:

bash 复制代码
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>kernel</artifactId>
    <version>7.1.16</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>io</artifactId>
    <version>7.1.16</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>layout</artifactId>
    <version>7.1.16</version>
</dependency>

由于我们要在pdf文档中写入中文内容,因此,务必引入字体文件。本文都以宋体(simsun.ttf)为例,字体文件可在系统目录 C:\Windows\Fonts 中找到,或自行百度在免费字体网下载。

亲测:如果文档中写入纯英文内容,可以不引入字体文件,如果需要写入中文内容,务必引入字体文件。

在项目的根目录创建fonts目录,并将字体文件拷贝至该目录中。目录可根据自己的需要定义。

编写方法, 返回字体文件所在位置

bash 复制代码
/**
 * 返回字体文件所在位置
 * 
 * @return
 */
private String getFontPath() {
    // 获取当前工作目录
    String projectRoot = System.getProperty("user.dir");
    String fontPath = projectRoot + "/fonts/simsun.ttf";
    return fontPath;
}

案例一:生成带有段落的PDF文件

bash 复制代码
/**
 * 生成带有段落的pdf文件
 */
public void generatePDFWithPara() {
    Document document = null;

    String fileName = UUID.randomUUID().toString().replaceAll("-", "") + ".pdf";
    String filePath = "D:/" + fileName;

    try {
        File file = new File(filePath);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        PdfWriter writer = new PdfWriter(filePath);
        PdfDocument pdfDoc = new PdfDocument(writer);
        // 设置纸张大小
        pdfDoc.setDefaultPageSize(PageSize.A4);

        document = new Document(pdfDoc);

        // 加载中文字体(确保字体文件存在)
        String fontPath = getFontPath();
        PdfFont font = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, true);

        Paragraph paragraph = new Paragraph("这是一首简单的小情歌");
        paragraph.setFontSize(16f); // 字体大小
        paragraph.setFont(font);  // 字体类型
        document.add(paragraph);
        System.out.println("内容已写入文件:" + filePath);
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException("生成PDF失败");
    } finally {
        if (document != null) {
            document.close();
        }
    }
}

案例二:生成带有表格的PDF文件

bash 复制代码
/**
 * 生成带有表格的pdf文件
 */
public void generatePDFWithTable() {
    Document document = null;

    String fileName = UUID.randomUUID().toString().replaceAll("-", "") + ".pdf";
    String filePath = "D:/" + fileName;

    try {
        File file = new File(filePath);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        PdfWriter writer = new PdfWriter(filePath);
        PdfDocument pdfDoc = new PdfDocument(writer);
        // 设置纸张大小
        pdfDoc.setDefaultPageSize(PageSize.A4);

        document = new Document(pdfDoc);

        // 加载中文字体(确保字体文件存在)
        String fontPath = getFontPath();
        PdfFont font = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, true);

        String[] ids = {"1001", "1002", "1003"};
        String[] names = {"张三", "李四", "王五"};
        String[] ages = {"18", "19", "20"};

        // 创建表格,3列
        Table table = new Table(UnitValue.createPercentArray(new float[]{2, 2, 2})).useAllAvailableWidth();
        table.setBorder(new SolidBorder(ColorConstants.BLACK, 2)); // 设置边框

        // 第一列 学号
        Cell cell1 = new Cell();
        cell1.setFont(font);
        for (String text : ids) {
            cell1.add(new Paragraph(text));
        }
        table.addCell(cell1);

        // 第二列 姓名
        Cell cell2 = new Cell();
        cell2.setFont(font);
        for (String text : names) {
            cell2.add(new Paragraph(text));
        }
        table.addCell(cell2);

        // 第三列 年龄
        Cell cell3 = new Cell();
        cell3.setFont(font);
        for (String text : ages) {
            cell3.add(new Paragraph(text));
        }
        table.addCell(cell3);

        document.add(table);
        System.out.println("内容已写入文件:" + filePath);
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException("生成PDF失败");
    } finally {
        if (document != null) {
            document.close();
        }
    }
}

案例三:生成带有图片的PDF文件

bash 复制代码
/**
 * 生成带有图片的pdf文件
 */
public void generatePDFWithImage() {
    Document document = null;

    String fileName = UUID.randomUUID().toString().replaceAll("-", "") + ".pdf";
    String filePath = "D:/" + fileName;

    try {
        File file = new File(filePath);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        PdfWriter writer = new PdfWriter(filePath);
        PdfDocument pdfDoc = new PdfDocument(writer);
        // 设置纸张大小
        pdfDoc.setDefaultPageSize(PageSize.A4);

        document = new Document(pdfDoc);

        // 图片路径,确保真实存在
        String imagePath = "D:/flower.png";
        ImageData imageData = ImageDataFactory.create(imagePath);
        document.add(new Image(imageData));

        System.out.println("内容已写入文件:" + filePath);
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException("生成PDF失败");
    } finally {
        if (document != null) {
            document.close();
        }
    }
}

案例四:生成带有二维码的PDF文件

该功能,需要引入第三方依赖,生成二维码,以Google官方提供的zxing为例。

bash 复制代码
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.3.3</version>
</dependency>

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.3.3</version>
</dependency>

在工具类QrCodeUtils中,编写生成二维码的方法:

bash 复制代码
/**
 * 生成二维码
 *
 * @param content
 * @return
 * @throws WriterException
 * @throws IOException
 */
public static Image generateQRCode(String content) throws WriterException, IOException {
    int width = 200;
    int height = 200;
    String format = "png";
    Map<EncodeHintType, Object> hints = new HashMap<>();
    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

    BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    MatrixToImageWriter.writeToStream(bitMatrix, format, baos);

    // Convert QR code to iText image and add it to the PDF
    Image img = new Image(ImageDataFactory.create(baos.toByteArray()));
    img.setMarginTop(0F);
    img.setMarginRight(0F);
    return img;
}

生成带有二维码的PDF文件:

bash 复制代码
/**
 * 生成带有二维码的pdf文件
 */
public void generatePDFWithQrcode() {
    Document document = null;

    String fileName = UUID.randomUUID().toString().replaceAll("-", "") + ".pdf";
    String filePath = "D:/" + fileName;

    try {
        File file = new File(filePath);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        PdfWriter writer = new PdfWriter(filePath);
        PdfDocument pdfDoc = new PdfDocument(writer);
        // 设置纸张大小
        pdfDoc.setDefaultPageSize(PageSize.A4);

        document = new Document(pdfDoc);

        // 二维码的内容,或url路径
        String urlContent = "https://blog.csdn.net/qq_35148205?spm=1000.2115.3001.10640";
        // 生成二维码
        Image image = QrCodeUtils.generateQRCode(urlContent);
        document.add(image);

        System.out.println("内容已写入文件:" + filePath);
    } catch (IOException | WriterException e) {
        e.printStackTrace();
        throw new RuntimeException("生成PDF失败");
    } finally {
        if (document != null) {
            document.close();
        }
    }
}

使用Java生成PDF文件的功能,在某些业务场景中经常会被使用。例如,MES系统的生产订单功能中,通常需要将带有标题、文本、表格、二维码的生产指示单,生成PDF文件,保存在服务器或OSS的某个路径下,前端通过访问该路径,预览并打印该PDF文件。开发人员可根据实际的业务需求,从数据库中查询对应的数据,根据指定的格式和排版,插入到需要生成的PDF文档中。

相关推荐
lichong95114 小时前
Android studio 修改包名
android·java·前端·ide·android studio·大前端·大前端++
lichong95114 小时前
Git 检出到HEAD 再修改提交commit 会消失解决方案
java·前端·git·python·github·大前端·大前端++
@yanyu66614 小时前
Tomcat安装与HTML响应实战
java·tomcat·html
Chen-Edward15 小时前
有了Spring为什么还有要Spring Boot?
java·spring boot·spring
陈小桔16 小时前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven
小学鸡!16 小时前
Spring Boot实现日志链路追踪
java·spring boot·后端
xiaogg367817 小时前
阿里云k8s1.33部署yaml和dockerfile配置文件
java·linux·kubernetes
逆光的July17 小时前
Hikari连接池
java
微风粼粼17 小时前
eclipse 导入javaweb项目,以及配置教程(傻瓜式教学)
java·ide·eclipse
番茄Salad17 小时前
Spring Boot临时解决循环依赖注入问题
java·spring boot·spring cloud