pdf文件的生成与下载
一、导入的依赖
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.11</version>
</dependency>
二、后端代码
//试卷导出pdf
@RequestMapping(value = "exportDetail",method = RequestMethod.POST)
@ResponseBody
public void exportDetail(Integer testId,HttpServletResponse response, HttpServletRequest request) throws Exception {
PaperSubModel model = paperService.getPaperDetailByKey(testId);
Testpaper paper = model.getPaper();
TimeUtil timeUtil = new TimeUtil();
String time = timeUtil.getTime(new Date());
PDFUtil pdfUtil = new PDFUtil(80,80,120,120,"D:\\uploadFile\\"+paper.getTestName()+time+".pdf");
pdfUtil.addParagraph(2,20,new Color(0,0,0),1,paper.getTestName());
pdfUtil.addParagraph(2,10,new Color(0,0,0),1,"总分:"+paper.getTestTotal()+"分");
List<MajorSubModel> subModels = model.getSubModels();
for (MajorSubModel subModel:subModels) {
List<MajorDetailModel> details = subModel.getDetails();
//获得每道小题的分数
int grade=Integer.parseInt(subModel.getMajor().getMajorTotal())/Integer.parseInt(subModel.getMajor().getMajorCount());
//获得大题的名称
SysDicData sysDicData = new SysDicData();
sysDicData.setDicType("sys_major_type");
sysDicData.setDicValue(subModel.getMajor().getMajorSubType());
SysDicData dicData = sysDicDataService.selectModel(sysDicData);
pdfUtil.addParagraph(2,15,new Color(0,0,0),0,dicData.getDicLabel()+"("+subModel.getMajor().getMajorTotal()+"分)");
switch (subModel.getMajor().getMajorSubType()){
case 1:
case 2:
for (MajorDetailModel detail:details ) {
pdfUtil.addParagraph(2,10,new Color(0,0,0),0,subNumber+"."+detail.getSubContent()+" ("+detail.getSubAnswer()+")("+grade+"分)");
String[] Answers = detail.getSubOption().split(";");
for (int j = 0; j <Answers.length; j++) {
char s = (char) ((char) 65+j);
pdfUtil.addTextIndent(2,10,new Color(0,0,0),2,s+".\t"+Answers[j]);
}
subNumber++;
}
subNumber=1;
break;
case 3 :
case 4 :
for (MajorDetailModel detail:details ) {
pdfUtil.addParagraph(2,10,new Color(0,0,0),0,subNumber+"."+detail.getSubContent()+" ("+detail.getSubAnswer()+")("+grade+"分)");
subNumber++;
}
subNumber=1;
break;
}
}
pdfUtil.close();
ResponseUtil.setPDFResponseHeader("D:\\uploadFile\\"+paper.getTestName()+time+".pdf",request,response);
}
三、用到的工具类
public class PDFUtil {
/**
* document对象
*/
private static Document document = null;
/**
* 创建一个书写器,布局文本位置
* @param leftSize 居左
* @param rightSize 居右
* @param onSize 居上
* @param underSize 居下
* @param path 存储位置
* @throws Exception 初始化PDF错误
*/
public PDFUtil(Integer leftSize , Integer rightSize , Integer onSize , Integer underSize, String path) throws Exception {
try{
// 新建document对象 第一个参数是页面大小。接下来的参数分别是左、右、上和下页边距。
document = new Document(PageSize.A4, leftSize, rightSize, onSize, underSize);
// 建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(path));
// 打开文件
document.open();
}catch (Exception e){
e.printStackTrace();
System.out.println("PDF初始化错误");
}
}
/**
* 书写每一个段落选择的字体
*
* @param fontType
* 0 //楷体字
* 1 //仿宋体
* 2 //黑体
* 字体需要可在追加
* @return
* @throws IOException
* @throws DocumentException
*/
public BaseFont addFontType(Integer fontType) {
BaseFont baseFont = null;
try{
switch (fontType){
case 0:
//楷体字
baseFont = BaseFont.createFont("c://windows//fonts//simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
break;
case 1:
//仿宋体
baseFont = BaseFont.createFont("c://windows//fonts//SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
break;
case 2:
//黑体
baseFont = BaseFont.createFont("c://windows//fonts//SIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
break;
}
return baseFont;
}catch (Exception e){
System.out.println("选择字体异常");
e.printStackTrace();
}
return baseFont;
}
/**
* 添加段落 - 段落位置( 0 居左 1 居中 2 居右)
* @param fontType 选择字体
* 0 //楷体字
* 1 //仿宋体
* 2 //黑体
* @param fontSize 字体大小
* @param color 字体颜色
* @param alignment 0 居左 1 居中 2 居右
* @param text 文本内容
*/
public void addParagraph(Integer fontType , Integer fontSize,Color color ,Integer alignment ,String text){
try{
BaseFont chinese =addFontType(fontType);
Font font = new Font(chinese, fontSize, Font.COURIER,color);
Paragraph paragraph =new Paragraph(text,font);
//居中显示
paragraph.setAlignment(alignment);
document.add(paragraph);
}catch (Exception e){
e.printStackTrace();
System.out.println("添加段落异常");
}
}
/**
* 添加段落 - 首行缩进
* @param fontType 选择字体
* 0 //楷体字
* 1 //仿宋体
* 2 //黑体
* @param fontSize 字体大小
* @param color 字体颜色
* @param index 首行缩进
* @param text 文本内容
*/
public void addTextIndent(Integer fontType , Integer fontSize,Color color
