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(音标)
本文来自博客园,作者:青喺半掩眉砂,转载请注明原文链接:https://www.cnblogs.com/xiaoguo-java/p/18740622
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通