java-PdfUtil(生成pdf并下载)

根据项目要求把相关数据整合到pdf中并下载,把数据流返回前端,使用itextpdf实现该功能
2025-02-27 11:07:46 星期四

一、相关依赖

<!--itextpdf-->
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itext7-core</artifactId>
                <version>7.1.16</version> <!-- 请检查最新版本 -->
                <type>pom</type>
            </dependency>
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>kernel</artifactId>
                <version>7.1.15</version>
            </dependency>
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>layout</artifactId>
                <version>7.1.15</version>
            </dependency>

二、具体代码

1.controller

@PostMapping("/articleDownload")
    @ApiOperation("阅读习题-pdf下载")
    public AjaxResult articleDownload(HttpServletResponse response, @RequestBody ArticleDownloadDTO dto) throws Exception {
        newArticleService.articleDownload(response,dto);
        return AjaxResult.success();
    }

2.service

/**
     * 阅读习题-pdf下载
     * @param dto
     */
    void articleDownload(HttpServletResponse response, ArticleDownloadDTO dto) throws IOException;

3.impl

结合实际数据进行整合,这里是示例数据

@Autowired
    private PdfUtil pdfUtil;

@Override
    public void articleDownload(HttpServletResponse response, ArticleDownloadDTO dto) throws IOException {
        //查询阅读原文、习题list
        ArticleDownloadVO vo = newArticleDao.getArticleMessage(dto.getNewArticleId());
        if (vo == null) {
            throw new RuntimeException("该篇阅读数据有误,请联系相关负责人!");
        }
        //【习题】
        List<ArticleExerciseDownloadVO> articleExerciseList = newArticleDao.getArticleExerciseList(dto.getNewArticleId());
        if (!articleExerciseList.isEmpty()) {
            for (ArticleExerciseDownloadVO articleExerciseDownloadVO : articleExerciseList) {
                List<ArticleExerciseOptionDownloadVO> articleExerciseOptionList = newArticleDao.getArticleExerciseOptionList(articleExerciseDownloadVO.getNewArticleExerciseId());
                if (!articleExerciseOptionList.isEmpty()) {
                    articleExerciseDownloadVO.setArticleExerciseOptionList(articleExerciseOptionList);
                }
            }
            vo.setArticleExerciseList(articleExerciseList);
        }
        //【重点词汇】
        List<NewArticleKeyWordDTO> articleKeyWordList = newArticleKeyWordDao.getArticleKeyWordList(dto.getNewArticleId());
        if (!articleKeyWordList.isEmpty()) {
            vo.setArticleKeyWordList(articleKeyWordList);
        }
        //【变形词】
        List<NewArticleYxWordDTO> articleYxWordList = newArticleYxWordMapper.getArticleYxWordList(dto.getNewArticleId());
        if (!articleYxWordList.isEmpty()) {
            //6.查询变形单词单词
            for (NewArticleYxWordDTO newArticleYxWordDTO : articleYxWordList) {
                List<NewArticleBxWordDTO> articleBxWordList = newArticleBxWordMapper.getArticleBxWordList(newArticleYxWordDTO.getNewArticleYxWordId());
                if (!articleBxWordList.isEmpty()) {
                    newArticleYxWordDTO.setArticleBxWordList(articleBxWordList);
                }
            }
            vo.setArticleYxWordList(articleYxWordList);
        }
        //【长难句】
        List<NewArticleSentenceDTO> articleSentenceList = newArticleSentenceMapper.getArticleSentenceList(dto.getNewArticleId());
        if (!articleSentenceList.isEmpty()) {
            for (NewArticleSentenceDTO newArticleSentenceDTO : articleSentenceList) {
                //长难句详情list
                List<NewArticleSentenceAssociationDTO> sentenceList = newArticleSentenceAssociationMapper.getListByNewArticleSentenceId(newArticleSentenceDTO.getNewArticleSentenceId());
                if (!sentenceList.isEmpty()) {
                    newArticleSentenceDTO.setSentenceList(sentenceList);
                }
            }
            vo.setArticleSentenceList(articleSentenceList);
        }
        //【重点语法】
        List<NewArticleGrammarDTO> articleGrammarList = newArticleGrammarMapper.getArticleGrammarList(dto.getNewArticleId());
        if (!articleGrammarList.isEmpty()) {
            vo.setArticleGrammarList(articleGrammarList);
        }
        pdfUtil.articleCreatePdf(response, vo);
    }

4.PdfUtil

4.1.系统配置文件

ruoyi:
    # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath),末尾不加/ F:/ilife/uploadPath
    profile: D:\project\uploadFile

4.2.PdfUtil

package com.ruoyi.school.util;

import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Text;
import com.itextpdf.layout.property.TextAlignment;
import com.ruoyi.school.domain.vo.*;
import com.ruoyi.school.domain.dto.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: pdfUtils
 * @Description:
 * @Author: 无泪之城-gzy
 * @Date: 2024/11/5 10:46
 */
@Slf4j
@Component
public class PdfUtil {

    @Value("${ruoyi.profile}")
    private String filePath;

    /**
     * 创建阅读理解PDF文件
     *
     * @param response
     * @param vo
     * @throws IOException
     */
    public void articleCreatePdf(HttpServletResponse response, ArticleDownloadVO vo) throws IOException {
        String pdfPath = filePath + "/template/template.pdf";
        // 加载中文字体
        String fontPath = filePath + "/ttf/syht.ttf";
        String ipaFontPath = filePath + "/ttf/DoulosSIL-Regular.ttf";
        String fileName = "阅读理解习题";
        if (vo.getTitle() != null) {
            fileName = "阅读-" + vo.getTitle();
        }
        //文件名需要这样写,不能在setHeader直接写中文名,否则下载的文件名字为空,只有后缀
        response.setCharacterEncoding("utf-8");
        fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".pdf");
        try {
            OutputStream out = response.getOutputStream();
            PdfWriter writer = new PdfWriter(out);
            PdfDocument pdf = new PdfDocument(writer);
            Document document = new Document(pdf);
            PdfFont chineseFont = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, true);
            PdfFont ipaFont = PdfFontFactory.createFont(ipaFontPath, PdfEncodings.IDENTITY_H, true);
            //添加标题,并使用中文字体
            if (vo.getTitle() != null) {
                Paragraph titleParagraph = new Paragraph(vo.getTitle())
                        .setFont(chineseFont)
                        .setFontSize(15)
                        .setTextAlignment(TextAlignment.CENTER)//设置段落对齐方式为居中
                        .setBold();
                document.add(titleParagraph);
            }
            //添加来源
            if (vo.getSource() != null) {
                Paragraph titleParagraph = new Paragraph("(" + vo.getSource() + ")")
                        .setFont(chineseFont)
                        .setFontSize(10)
                        .setTextAlignment(TextAlignment.CENTER)//设置段落对齐方式为居中
                        .setBold();
                document.add(titleParagraph);
            }
            //添加原文标题
            Paragraph article = new Paragraph("【原文】:")
                    .setFont(chineseFont)
                    .setFontSize(15)
                    .setBold();
            document.add(article);
            //1.【原文内容】
            document.add(new Paragraph(vo.getKnowledge()).setFontSize(10).setFont(chineseFont).setBold().setFirstLineIndent(20f));
            //换行
            document.add(new Paragraph("\n"));
            //2.【习题】
            Paragraph question = new Paragraph("【习题】:")
                    .setFont(chineseFont)
                    .setFontSize(15)
                    .setBold();
            document.add(question);
            // 遍历习题和答案列表,并添加到PDF中
            for (ArticleExerciseDownloadVO articleExerciseVO : vo.getArticleExerciseList()) {
                // 添加问题
                document.add(new Paragraph(articleExerciseVO.getNum() + "." + articleExerciseVO.getTitle() + "(" + articleExerciseVO.getAnswerType() + ")").setFontSize(12).setFont(chineseFont).setBold());
                // 添加习题选项-todo 注意这里,习题选项有可能是图片,需要判断下
                for (ArticleExerciseOptionDownloadVO articleExerciseOptionVO : articleExerciseVO.getArticleExerciseOptionList()) {
                    document.add(new Paragraph(articleExerciseOptionVO.getXtOption() + "、" + articleExerciseOptionVO.getEnMsg()).setFontSize(10).setFont(chineseFont).setBold());
                }
            }

            //3.【重点词汇】
            if (vo.getArticleKeyWordList() != null) {
                document.add(new Paragraph("\n"));//换行
                Paragraph keyWord = new Paragraph("【重点词汇】:")
                        .setFont(chineseFont)
                        .setFontSize(15)
                        .setBold();
                document.add(keyWord);
                int keyWordNum = 1;
                for (NewArticleKeyWordDTO newArticleKeyWordDTO : vo.getArticleKeyWordList()) {
                    //合并单词中文内容和音标内容到一行显示(音标和中文的字体不同)
                    Paragraph paragraph = new Paragraph();
                    paragraph.add(new Text(keyWordNum + ". " + newArticleKeyWordDTO.getWord() + "  ")
                            .setFontSize(12)
                            .setFont(chineseFont)
                            .setBold());
                    paragraph.add(new Text(newArticleKeyWordDTO.getIpa()+"  ")
                            .setFontSize(12)
                            .setFont(ipaFont)
                            .setBold());
                    paragraph.add(new Text("释义:" + newArticleKeyWordDTO.getZh()+"  ")
                            .setFontSize(12)
                            .setFont(chineseFont)
                            .setBold());
                    document.add(paragraph);
                    document.add(new Paragraph("单词所属原文:" + newArticleKeyWordDTO.getOriginalSentence()).setFontSize(10).setFont(chineseFont).setBold());
                    document.add(new Paragraph("单词所属原文翻译:" + newArticleKeyWordDTO.getOriginalSentenceTranslation()).setFontSize(10).setFont(chineseFont).setBold());
                    keyWordNum++;
                }
            }
            //4.【变形词汇】
            if (vo.getArticleYxWordList() != null) {
                document.add(new Paragraph("\n"));//换行
                Paragraph bxWord = new Paragraph("【变形词汇】:")
                        .setFont(chineseFont)
                        .setFontSize(15)
                        .setBold();
                document.add(bxWord);
                int yxWordNum = 1;
                for (NewArticleYxWordDTO newArticleYxWordDTO : vo.getArticleYxWordList()) {
                    Paragraph paragraph = new Paragraph();
                    paragraph.add(new Text(yxWordNum + ". " + newArticleYxWordDTO.getWord() + "  ")
                            .setFontSize(12)
                            .setFont(chineseFont)
                            .setBold());
                    paragraph.add(new Text(newArticleYxWordDTO.getIpa()+"  ")
                            .setFontSize(12)
                            .setFont(ipaFont)
                            .setBold());
                    paragraph.add(new Text("释义:" + newArticleYxWordDTO.getZh()+"  ")
                            .setFontSize(12)
                            .setFont(chineseFont)
                            .setBold());
                    document.add(paragraph);
                    if (newArticleYxWordDTO.getArticleBxWordList() != null) {
                        int bxWordNum = 1;
                        Paragraph bxTitle = new Paragraph("变形:")
                                .setFont(chineseFont)
                                .setFontSize(12)
                                .setBold();
                        document.add(bxTitle);
                        for (NewArticleBxWordDTO newArticleBxWordDTO : newArticleYxWordDTO.getArticleBxWordList()) {
                            Paragraph bxWordParagraph = new Paragraph();
                            bxWordParagraph.add(new Text(bxWordNum + ". " + newArticleBxWordDTO.getWord() + "  ")
                                    .setFontSize(12)
                                    .setFont(chineseFont)
                                    .setBold());
                            bxWordParagraph.add(new Text(newArticleBxWordDTO.getIpa()+"  ")
                                    .setFontSize(12)
                                    .setFont(ipaFont)
                                    .setBold());
                            bxWordParagraph.add(new Text("释义:" + newArticleBxWordDTO.getZh()+"  ")
                                    .setFontSize(12)
                                    .setFont(chineseFont)
                                    .setBold());
                            document.add(bxWordParagraph);
                            bxWordNum++;
                        }
                    }
                    yxWordNum++;
                }
            }
            //5.【长难句】
            if (vo.getArticleSentenceList() != null) {
                document.add(new Paragraph("\n"));//换行
                Paragraph sentence = new Paragraph("【长难句】:")
                        .setFont(chineseFont)
                        .setFontSize(15)
                        .setBold();
                document.add(sentence);
                int sentenceNum = 1;
                for (NewArticleSentenceDTO newArticleSentenceDTO : vo.getArticleSentenceList()) {
                    document.add(new Paragraph(sentenceNum + ". " + newArticleSentenceDTO.getSentence()).setFontSize(12).setFont(chineseFont).setBold());
                    document.add(new Paragraph("翻译:" + newArticleSentenceDTO.getSentenceZh()).setFontSize(12).setFont(chineseFont).setBold());
                    if (newArticleSentenceDTO.getSentenceList() != null) {
                        List<NewArticleSentenceAssociationDTO> zgSentenceList = new ArrayList<>();
                        List<NewArticleSentenceAssociationDTO> cjSentenceList = new ArrayList<>();
                        List<NewArticleSentenceAssociationDTO> phraseList = new ArrayList<>();
                        List<NewArticleSentenceAssociationDTO> tenseList = new ArrayList<>();
                        for (NewArticleSentenceAssociationDTO newArticleSentenceAssociationDTO : newArticleSentenceDTO.getSentenceList()) {
                            switch (newArticleSentenceAssociationDTO.getType()) {
                                case 0:
                                    zgSentenceList.add(newArticleSentenceAssociationDTO);
                                    break;
                                case 1:
                                    cjSentenceList.add(newArticleSentenceAssociationDTO);
                                    break;
                                case 2:
                                    phraseList.add(newArticleSentenceAssociationDTO);
                                    break;
                                case 3:
                                    tenseList.add(newArticleSentenceAssociationDTO);
                                    break;
                            }
                        }
                        if (zgSentenceList!=null){
                            document.add(new Paragraph("———————————————————————主干———————————————————————")
                                    .setFont(chineseFont)
                                    .setFontSize(12)
                                    .setBold());
                            int zgSentenceNum = 1;
                            for (NewArticleSentenceAssociationDTO newArticleSentenceAssociationDTO : zgSentenceList) {
                                document.add(new Paragraph(zgSentenceNum + ". " + newArticleSentenceAssociationDTO.getSentence()).setFontSize(12).setFont(chineseFont).setBold());
                                document.add(new Paragraph("拆解: " + newArticleSentenceAssociationDTO.getSentenceBreakdown()).setFontSize(12).setFont(chineseFont).setBold());
                                document.add(new Paragraph("解析: " + newArticleSentenceAssociationDTO.getSentenceZh()).setFontSize(12).setFont(chineseFont).setBold());
                                zgSentenceNum++;
                            }
                        }
                        if (cjSentenceList!=null){
                            document.add(new Paragraph("———————————————————————从句———————————————————————")
                                    .setFont(chineseFont)
                                    .setFontSize(12)
                                    .setBold());
                            int cjSentenceNum = 1;
                            for (NewArticleSentenceAssociationDTO newArticleSentenceAssociationDTO : cjSentenceList) {
                                document.add(new Paragraph(cjSentenceNum + ". " + newArticleSentenceAssociationDTO.getSentence()).setFontSize(12).setFont(chineseFont).setBold());
                                document.add(new Paragraph("拆解: " + newArticleSentenceAssociationDTO.getSentenceBreakdown()).setFontSize(12).setFont(chineseFont).setBold());
                                document.add(new Paragraph("解析: " + newArticleSentenceAssociationDTO.getSentenceZh()).setFontSize(12).setFont(chineseFont).setBold());
                                cjSentenceNum++;
                            }
                        }
                        if (phraseList!=null){
                            document.add(new Paragraph("———————————————————————词组———————————————————————")
                                    .setFont(chineseFont)
                                    .setFontSize(12)
                                    .setBold());
                            int phraseNum = 1;
                            for (NewArticleSentenceAssociationDTO newArticleSentenceAssociationDTO : phraseList) {
                                document.add(new Paragraph(phraseNum + ". " + newArticleSentenceAssociationDTO.getPhrase() + "  翻译:" + newArticleSentenceAssociationDTO.getPhraseZh()).setFontSize(12).setFont(chineseFont).setBold());
                                phraseNum++;
                            }
                        }
                        if (tenseList!=null){
                            document.add(new Paragraph("———————————————————————时态———————————————————————")
                                    .setFont(chineseFont)
                                    .setFontSize(12)
                                    .setBold());
                            int tenseNum = 1;
                            for (NewArticleSentenceAssociationDTO newArticleSentenceAssociationDTO : tenseList) {
                                document.add(new Paragraph(tenseNum + ". " + newArticleSentenceAssociationDTO.getTense()).setFontSize(12).setFont(chineseFont).setBold());
                                tenseNum++;
                            }
                        }
                    }
                    sentenceNum++;
                }
            }
            //6.【重点语法】
            if (vo.getArticleGrammarList()!=null){
                document.add(new Paragraph("\n"));//换行
                document.add(new Paragraph("【重点语法】:")
                        .setFont(chineseFont)
                        .setFontSize(15)
                        .setBold());
                int grammarNum = 1;
                for (NewArticleGrammarDTO newArticleGrammarDTO : vo.getArticleGrammarList()) {
                    document.add(new Paragraph(grammarNum + ". " + newArticleGrammarDTO.getGrammar()).setFontSize(12).setFont(chineseFont).setBold());
                    document.add(new Paragraph("  解析:" + newArticleGrammarDTO.getGrammarZh()).setFontSize(12).setFont(chineseFont).setBold());
                    grammarNum++;
                }
            }
            // 加载图片
            // 假设图片位于项目的资源目录中
//            String imagePath = filePath+"/upload/2024/11/27/IMG2_20241127183326A001.png";
//            ImageData imageData = ImageDataFactory.create(imagePath);
//            // 创建图片对象
//            Image image = new Image(imageData);
//            // 可选:设置图片的大小、位置等属性
//             image.scaleToFit(100, 100); // 例如,将图片缩放到100x100大小
//            // image.setFixedPosition(100, 500); // 例如,将图片固定在页面的特定位置
//            // 将图片添加到文档中
//            document.add(image);

            document.close();
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建完型PDF文件
     *
     * @param response
     * @param vo
     * @throws IOException
     */
    public void gestaltCreatePdf(HttpServletResponse response, GestaltDownloadVO vo) throws IOException {
        String pdfPath = filePath + "/template/template.pdf";
        // 加载中文字体
        String fontPath = filePath + "/ttf/syht.ttf";
        String ipaFontPath = filePath + "/ttf/DoulosSIL-Regular.ttf";
        String fileName = "完型填空习题";
        if (vo.getTitle() != null) {
            fileName = "完型-" + vo.getTitle();
        }
        //文件名需要这样写,不能在setHeader直接写中文名,否则下载的文件名字为空,只有后缀
        response.setCharacterEncoding("utf-8");
        fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".pdf");
        try {
            OutputStream out = response.getOutputStream();
            PdfWriter writer = new PdfWriter(out);
            PdfDocument pdf = new PdfDocument(writer);
            Document document = new Document(pdf);
            PdfFont chineseFont = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, true);
            PdfFont ipaFont = PdfFontFactory.createFont(ipaFontPath, PdfEncodings.IDENTITY_H, true);
            //添加标题,并使用中文字体
            if (vo.getTitle() != null) {
                Paragraph titleParagraph = new Paragraph(vo.getTitle())
                        .setFont(chineseFont)
                        .setFontSize(15)
                        .setTextAlignment(TextAlignment.CENTER)//设置段落对齐方式为居中
                        .setBold();
                document.add(titleParagraph);
            }
            //添加来源
            if (vo.getSource() != null) {
                Paragraph titleParagraph = new Paragraph("(" + vo.getSource() + ")")
                        .setFont(chineseFont)
                        .setFontSize(10)
                        .setTextAlignment(TextAlignment.CENTER)//设置段落对齐方式为居中
                        .setBold();
                document.add(titleParagraph);
            }
            //添加原文标题
            Paragraph article = new Paragraph("原文:")
                    .setFont(chineseFont)
                    .setFontSize(15)
                    .setBold();
            document.add(article);
            //添加原文内容
            document.add(new Paragraph(vo.getKnowledge()).setFontSize(10).setFont(chineseFont).setBold().setFirstLineIndent(20f));
            //换行
            document.add(new Paragraph("\n"));
            //添加习题标题
            Paragraph question = new Paragraph("习题:")
                    .setFont(chineseFont)
                    .setFontSize(15)
                    .setBold();
            document.add(question);
            // 遍历习题和答案列表,并添加到PDF中
            for (GestaltExerciseDownloadVO gestaltExerciseVO : vo.getGestaltExerciseList()) {
                // 添加序号
                String num=gestaltExerciseVO.getNum() + ".    ";
                // 添加习题选项
                List<String> stringList=new ArrayList<>();
                for (GestaltExerciseOptionDownloadVO gestaltExerciseOptionVO : gestaltExerciseVO.getGestaltExerciseOptionList()) {
                    String option="";
                    if (gestaltExerciseOptionVO.getXtOption().equals("A")){
                        option=num+gestaltExerciseOptionVO.getXtOption() + "、" + gestaltExerciseOptionVO.getEnMsg();
                    }else {
                        option=gestaltExerciseOptionVO.getXtOption() + "、" + gestaltExerciseOptionVO.getEnMsg();
                    }
                    stringList.add(option);
                }
                Paragraph paragraph = new Paragraph();
                for (String s : stringList) {
                    paragraph.add(s+"    ");
                }
                document.add(paragraph.setFontSize(10).setFont(chineseFont).setBold());
            }

            //3.【重点词汇】
            if (vo.getGestaltKeyWordList() != null) {
                document.add(new Paragraph("\n"));//换行
                Paragraph keyWord = new Paragraph("【重点词汇】:")
                        .setFont(chineseFont)
                        .setFontSize(15)
                        .setBold();
                document.add(keyWord);
                int keyWordNum = 1;
                for (NewGestaltKeyWordDTO newGestaltKeyWordDTO : vo.getGestaltKeyWordList()) {
                    //合并单词中文内容和音标内容到一行显示(音标和中文的字体不同)
                    Paragraph paragraph = new Paragraph();
                    paragraph.add(new Text(keyWordNum + ". " + newGestaltKeyWordDTO.getWord() + "  ")
                            .setFontSize(12)
                            .setFont(chineseFont)
                            .setBold());
                    paragraph.add(new Text(newGestaltKeyWordDTO.getIpa()+"  ")
                            .setFontSize(12)
                            .setFont(ipaFont)
                            .setBold());
                    paragraph.add(new Text("释义:" + newGestaltKeyWordDTO.getZh()+"  ")
                            .setFontSize(12)
                            .setFont(chineseFont)
                            .setBold());
                    document.add(paragraph);
                    document.add(new Paragraph("单词所属原文:" + newGestaltKeyWordDTO.getOriginalSentence()).setFontSize(10).setFont(chineseFont).setBold());
                    document.add(new Paragraph("单词所属原文翻译:" + newGestaltKeyWordDTO.getOriginalSentenceTranslation()).setFontSize(10).setFont(chineseFont).setBold());
                    keyWordNum++;
                }
            }
            //4.【变形词汇】
            if (vo.getGestaltYxWordList() != null) {
                document.add(new Paragraph("\n"));//换行
                Paragraph bxWord = new Paragraph("【变形词汇】:")
                        .setFont(chineseFont)
                        .setFontSize(15)
                        .setBold();
                document.add(bxWord);
                int yxWordNum = 1;
                for (NewGestaltYxWordDTO newGestaltYxWordDTO : vo.getGestaltYxWordList()) {
                    Paragraph paragraph = new Paragraph();
                    paragraph.add(new Text(yxWordNum + ". " + newGestaltYxWordDTO.getWord() + "  ")
                            .setFontSize(12)
                            .setFont(chineseFont)
                            .setBold());
                    paragraph.add(new Text(newGestaltYxWordDTO.getIpa()+"  ")
                            .setFontSize(12)
                            .setFont(ipaFont)
                            .setBold());
                    paragraph.add(new Text("释义:" + newGestaltYxWordDTO.getZh()+"  ")
                            .setFontSize(12)
                            .setFont(chineseFont)
                            .setBold());
                    document.add(paragraph);
                    if (newGestaltYxWordDTO.getGestaltBxWordList() != null) {
                        int bxWordNum = 1;
                        Paragraph bxTitle = new Paragraph("变形:")
                                .setFont(chineseFont)
                                .setFontSize(12)
                                .setBold();
                        document.add(bxTitle);
                        for (NewGestaltBxWordDTO newGestaltBxWordDTO : newGestaltYxWordDTO.getGestaltBxWordList()) {
                            Paragraph bxWordParagraph = new Paragraph();
                            bxWordParagraph.add(new Text(bxWordNum + ". " + newGestaltBxWordDTO.getWord() + "  ")
                                    .setFontSize(12)
                                    .setFont(chineseFont)
                                    .setBold());
                            bxWordParagraph.add(new Text(newGestaltBxWordDTO.getIpa()+"  ")
                                    .setFontSize(12)
                                    .setFont(ipaFont)
                                    .setBold());
                            bxWordParagraph.add(new Text("释义:" + newGestaltBxWordDTO.getZh()+"  ")
                                    .setFontSize(12)
                                    .setFont(chineseFont)
                                    .setBold());
                            bxWordParagraph.add(new Text("时态:" + newGestaltBxWordDTO.getTense()+"  ")
                                    .setFontSize(12)
                                    .setFont(chineseFont)
                                    .setBold());
                            document.add(bxWordParagraph);
                            bxWordNum++;
                        }
                    }
                    yxWordNum++;
                }
            }
            //5.【长难句】
            if (vo.getGestaltSentenceList() != null) {
                document.add(new Paragraph("\n"));//换行
                Paragraph sentence = new Paragraph("【长难句】:")
                        .setFont(chineseFont)
                        .setFontSize(15)
                        .setBold();
                document.add(sentence);
                int sentenceNum = 1;
                for (NewGestaltSentenceDTO newGestaltSentenceDTO : vo.getGestaltSentenceList()) {
                    document.add(new Paragraph(sentenceNum + ". " + newGestaltSentenceDTO.getSentence()).setFontSize(12).setFont(chineseFont).setBold());
                    document.add(new Paragraph("翻译:" + newGestaltSentenceDTO.getSentenceZh()).setFontSize(12).setFont(chineseFont).setBold());
                    if (newGestaltSentenceDTO.getSentenceList() != null) {
                        List<NewGestaltSentenceAssociationDTO> zgSentenceList = new ArrayList<>();
                        List<NewGestaltSentenceAssociationDTO> cjSentenceList = new ArrayList<>();
                        List<NewGestaltSentenceAssociationDTO> phraseList = new ArrayList<>();
                        List<NewGestaltSentenceAssociationDTO> tenseList = new ArrayList<>();
                        for (NewGestaltSentenceAssociationDTO newGestaltSentenceAssociationDTO : newGestaltSentenceDTO.getSentenceList()) {
                            switch (newGestaltSentenceAssociationDTO.getType()) {
                                case 0:
                                    zgSentenceList.add(newGestaltSentenceAssociationDTO);
                                    break;
                                case 1:
                                    cjSentenceList.add(newGestaltSentenceAssociationDTO);
                                    break;
                                case 2:
                                    phraseList.add(newGestaltSentenceAssociationDTO);
                                    break;
                                case 3:
                                    tenseList.add(newGestaltSentenceAssociationDTO);
                                    break;
                            }
                        }
                        if (zgSentenceList!=null){
                            document.add(new Paragraph("———————————————————————主干———————————————————————")
                                    .setFont(chineseFont)
                                    .setFontSize(12)
                                    .setBold());
                            int zgSentenceNum = 1;
                            for (NewGestaltSentenceAssociationDTO newGestaltSentenceAssociationDTO : zgSentenceList) {
                                document.add(new Paragraph(zgSentenceNum + ". " + newGestaltSentenceAssociationDTO.getSentence()).setFontSize(12).setFont(chineseFont).setBold());
                                document.add(new Paragraph("拆解: " + newGestaltSentenceAssociationDTO.getSentenceBreakdown()).setFontSize(12).setFont(chineseFont).setBold());
                                document.add(new Paragraph("解析: " + newGestaltSentenceAssociationDTO.getSentenceZh()).setFontSize(12).setFont(chineseFont).setBold());
                                zgSentenceNum++;
                            }
                        }
                        if (cjSentenceList!=null){
                            document.add(new Paragraph("———————————————————————从句———————————————————————")
                                    .setFont(chineseFont)
                                    .setFontSize(12)
                                    .setBold());
                            int cjSentenceNum = 1;
                            for (NewGestaltSentenceAssociationDTO newGestaltSentenceAssociationDTO : cjSentenceList) {
                                document.add(new Paragraph(cjSentenceNum + ". " + newGestaltSentenceAssociationDTO.getSentence()).setFontSize(12).setFont(chineseFont).setBold());
                                document.add(new Paragraph("拆解: " + newGestaltSentenceAssociationDTO.getSentenceBreakdown()).setFontSize(12).setFont(chineseFont).setBold());
                                document.add(new Paragraph("解析: " + newGestaltSentenceAssociationDTO.getSentenceZh()).setFontSize(12).setFont(chineseFont).setBold());
                                cjSentenceNum++;
                            }
                        }
                        if (phraseList!=null){
                            document.add(new Paragraph("———————————————————————词组———————————————————————")
                                    .setFont(chineseFont)
                                    .setFontSize(12)
                                    .setBold());
                            int phraseNum = 1;
                            for (NewGestaltSentenceAssociationDTO newGestaltSentenceAssociationDTO : phraseList) {
                                document.add(new Paragraph(phraseNum + ". " + newGestaltSentenceAssociationDTO.getPhrase() + "  翻译:" + newGestaltSentenceAssociationDTO.getPhraseZh()).setFontSize(12).setFont(chineseFont).setBold());
                                phraseNum++;
                            }
                        }
                        if (tenseList!=null){
                            document.add(new Paragraph("———————————————————————时态———————————————————————")
                                    .setFont(chineseFont)
                                    .setFontSize(12)
                                    .setBold());
                            int tenseNum = 1;
                            for (NewGestaltSentenceAssociationDTO newGestaltSentenceAssociationDTO : tenseList) {
                                document.add(new Paragraph(tenseNum + ". " + newGestaltSentenceAssociationDTO.getTense()).setFontSize(12).setFont(chineseFont).setBold());
                                tenseNum++;
                            }
                        }
                    }
                    sentenceNum++;
                }
            }
            //6.【重点语法】
            if (vo.getGestaltGrammarList()!=null){
                document.add(new Paragraph("\n"));//换行
                document.add(new Paragraph("【重点语法】:")
                        .setFont(chineseFont)
                        .setFontSize(15)
                        .setBold());
                int grammarNum = 1;
                for (NewGestaltGrammarDTO newGestaltGrammarDTO : vo.getGestaltGrammarList()) {
                    document.add(new Paragraph(grammarNum + ". " + newGestaltGrammarDTO.getGrammar()).setFontSize(12).setFont(chineseFont).setBold());
                    document.add(new Paragraph("  解析:" + newGestaltGrammarDTO.getGrammarZh()).setFontSize(12).setFont(chineseFont).setBold());
                    grammarNum++;
                }
            }

            // 加载图片
            // 假设图片位于项目的资源目录中
//            String imagePath = filePath+"/upload/2024/11/27/IMG2_20241127183326A001.png";
//            ImageData imageData = ImageDataFactory.create(imagePath);
//            // 创建图片对象
//            Image image = new Image(imageData);
//            // 可选:设置图片的大小、位置等属性
//             image.scaleToFit(100, 100); // 例如,将图片缩放到100x100大小
//            // image.setFixedPosition(100, 500); // 例如,将图片固定在页面的特定位置
//            // 将图片添加到文档中
//            document.add(image);
            document.close();
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5.示例使用对象

package com.ruoyi.school.domain.dto;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

@Data
public class ArticleDownloadDTO implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("新阅读理解表id")
    private Long newArticleId;
}

6.相关字体下载(百度网盘)

6.1. syht.ttf(中英文)

6.2. DoulosSIL-Regular.ttf(音标)

posted @   青喺半掩眉砂  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示