使用itextpdf生成pdf,设置图片和中文

依赖

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

中文字体,我是在windows 10 上找的宋体C:\Windows\Fonts\STSONG.TTF

放在springboot的resources目录font下面

简单的工具类

package com.cgw.utils;


import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.core.io.ClassPathResource;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class PdfUtil {


    /**
     * 将图片写入pdf
     *
     * @param imageFiles
     * @return
     * @throws IOException
     */
    public static File generatePdf(File... imageFiles) throws IOException, DocumentException {
        if (ArrayUtils.isEmpty(imageFiles)) {
            return null;
        }
        File pdfFile = FileUtil.createTempFile("tmp.pdf");

        ClassPathResource resource = new ClassPathResource("font/STSONG.TTF");
        BaseFont baseFont = BaseFont.createFont(resource.getURL().toString(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        Font font = new Font(baseFont);
        // 创建文件
        Document document = new Document();
        // 建立一个书写器
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFile));
        writer.setStrictImageSequence(true);
        // 打开文件
        document.open();
        // 添加内容
        Paragraph paragraph = new Paragraph("你好世界,hello world", font);
        paragraph.setAlignment(Element.ALIGN_CENTER);
        document.add(paragraph);

        float scalePercentage = (72 / 300f) * 100.0f;

        for (File imageFile : imageFiles) {
            // 图片
            Image image = Image.getInstance(imageFile.getAbsolutePath());
            image.scalePercent(scalePercentage, scalePercentage);
            image.setAlignment(Element.ALIGN_CENTER);
            // 将图片1添加到pdf文件中
            document.add(image);
        }
        // 关闭文档
        document.close();
        // 关闭书写器
        writer.close();

        return pdfFile;
    }
}

FileUtil.java

package com.casic.dataapplication.utils;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

public class FileUtil {
    private static Logger logger = LoggerFactory.getLogger(FileUtil.class);
    private static final String TMP_FILE_NAME = "file.tmp"

    public static Path getTempPath() {
        String realPath = System.getProperty("java.io.tmpdir");
        String id = UUID.randomUUID().toString().replace("-", "");
        Path path = Paths.get(realPath, id);
        try {
            FileUtils.forceMkdir(path.toFile());
        } catch (IOException e) {
            logger.error("创建临时目录异常:{}", e);
            throw new RuntimeException(e);
        }
        return path;
    }

    /**
     * 创建一个临时文件
     *
     * @param filename
     * @return
     */
    public static File createTempFile(String filename) {
        return getTempPath().resolve(filename).toFile();
    }

    /**
     * 创建一个临时文件
     *
     * @return
     */
    public static File createTempFile() {
        return getTempPath().resolve(TMP_FILE_NAME).toFile();
    }

    /**
     * 删除一个文件
     */
    public static boolean deleteFile(File file) {
        logger.debug("删除文件:{}", file.getAbsolutePath());
        return FileUtils.deleteQuietly(file);
    }

    /**
     * 删除一个文件同时删除父目录
     *
     * @return true删除成功,false删除失败
     */
    public static boolean deleteFileAndParentPath(File file) {
        logger.debug("删除文件和父目录:{}", file.getAbsolutePath());
        return FileUtils.deleteQuietly(file) && FileUtils.deleteQuietly(file.getParentFile());
    }

}

调用时传的图片资源
在这里插入图片描述

效果图
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值