Commit f8714f4d authored by 盖献康's avatar 盖献康

调用PDF工具类方法(测试+修改)

parent 1a1b4234
package com.ruoyi.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.hash.Hash;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.ArrayListMultimap;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.codec.Base64;
......@@ -21,10 +24,8 @@ import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.stream.IntStream;
/**
......@@ -55,56 +56,93 @@ public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements Bo
@Override
public Document generateItextPdfDocument(OutputStream os) throws Exception {
// document
// 创建一个A4大小的PDF
PdfBaseWriter document = new PdfBaseWriter(os);
// Document document = new Document(PageSize.A4);
// PdfWriter.getInstance(document, os);
// open
// 打开
document.open();
// add content - pdf meta information
document.addAuthor("pdai");
// PDF文档属性
document.addTitle("标题(测试基本PDF导出)");
document.addAuthor("作者");
document.addSubject("主题(基本PDF导出)");
document.addKeywords("关键字(基本PDF导出)");
document.addCreator("谁创建的(xxx有限公司)");
document.addCreationDate();
document.addTitle("pdai-pdf-itextpdf");
document.addKeywords("pdf-pdai-keyword");
document.addCreator("pdai");
// add content - page content
// Title
document.add(document.getParagraph(1, "JAVA全栈知识体系"));
// Chapter 1
Chapter title1 = document.setTitle1("知识准备", 1);
document.setTitle2(title1,"什么是POI");
document.writeText("Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。");
document.setTitle2(title1,"POI中基础概念");
document.writeText("生成xls和xlsx有什么区别?POI对Excel中的对象的封装对应关系?");
// Chapter 2
Chapter title2 = document.setTitle1("实现案例", 2);
document.setTitle2(title2,"用户列表示例");
document.writeText("以导出用户列表为例");
// 表格
PdfPTable table = new PdfPTable(new float[]{20, 40, 50, 40, 40});
table.setTotalWidth(500);
table.setLockedWidth(true);
table.setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setBorder(1);
for (int i = 0; i < 5; i++) {
table.addCell(document.createLeftCell("1"));
table.addCell(document.createLeftCell("2"));
table.addCell(document.createLeftCell("3"));
table.addCell(document.createLeftCell("4"));
table.addCell(document.createLeftCell("5"));
// 测试标题加文本内容
// 添加第一个标题
Chapter chapterOne = document.setTitle1("模拟标题1", 1);
// 添加第一个标题下的第一个二级标题
document.setTitle2(chapterOne, "标题1-1");
// 添加内容
document.writeText("石油是指气态、液态和固态的烃类混合物,具有天然的产状。石油又分为原油、天然气、天然气液及天然焦油等形式,但习惯上仍将“石油”作为“原油”的定义用。");
// 添加第一个标题下的第二个二级标题
document.setTitle2(chapterOne, "标题1-2");
document.writeText("石油是一种黏稠的、深褐色液体,被称为“工业的血液”。地壳上层部分地区有石油储存。主要成分是各种烷烃、环烷烃、芳香烃的混合物。是地质勘探的主要对象之一。");
// 添加第二个标题
Chapter chapterTwo = document.setTitle1("模拟标题2", 2);
document.setTitle2(chapterTwo, "标题2-1");
document.writeText("石油的成油机理有生物沉积变油和石化油两种学说,前者较广为接受,认为石油是古代海洋或湖泊中的生物经过漫长的演化形成,属于生物沉积变油,不可再生;后者认为石油是由地壳内本身的碳生成,与生物无关,可再生。石油主要被用来作为燃油和汽油,也是许多化学工业产品,如溶液、化肥、杀虫剂和塑料等的原料。");
document.setTitle2(chapterTwo, "标题2-2");
document.writeText("2023年2月16日,中国石油和化学工业联合会发布数据称,中国炼油产能已超过美国,成为世界第一炼油大国。2023年2月16日,中国石油和化学工业联合会发布数据称,中国炼油产能已超过美国,成为世界第一炼油大国。");
// 测试自定义段(可当标题、正文使用)
document.add(document.getParagraph(1, "Paragraph"));
// 测试自定义段方向
Paragraph paragraph = document.getParagraph(2, "左对齐");
paragraph.setAlignment(Element.ALIGN_RIGHT);
document.add(paragraph);
// 测试(List)列
List<String> list = new ArrayList<>();
list.add("第一行");
list.add("第二行");
list.add("第三行");
document.writeList(list, true);
// 测试(Map)列
Map<String, String> map = new HashMap<>();
map.put("甲方", "可填入动态公司");
map.put("乙方", "可填入动态公司");
map.put("时间", String.valueOf(DateUtil.date()));
map.put("地点", "可填入动态地点");
document.writeList(map, false);
// 测试带表头的表格
ArrayList<LinkedHashMap<String, Object>> rows = new ArrayList<>();
for (int i = 0;i < 10;i ++) {
LinkedHashMap<String, Object> row = new LinkedHashMap<>();
row.put("姓名", "张三"+i);
row.put("年龄", 23 + i);
row.put("成绩", 88.32 + i);
row.put("是否合格", true);
row.put("考试日期", DateUtil.date());
rows.add(row);
}
document.writeTable(rows);
// 测试自定义表格
PdfPTable table = new PdfPTable(new float[]{40, 150});
table.setWidthPercentage(100);
// 上下边距
table.setSpacingBefore(10);
table.setSpacingAfter(10);
document.writeCell("电话:",1, 1, table);
document.writeCell("地址:", 1, 1, table);
document.writeCell("手机号:", 1, 1, table);
// 一个cell图文混合
List<String> list2 = new ArrayList<>();
list2.add("哈哈哈");
list2.add("C:/Users/gxk/Pictures/Saved Pictures/nvm.png");
list2.add("啊啊啊");
list2.add( "C:/Users/gxk/Pictures/Saved Pictures/123.jpg");
document.writeTextAndImageCell(list2, table);
// 把表格添加进入PDF
document.add(table);
document.setTitle2(title2,"图片导出示例");
document.writeText("以导出图片为例");
// 图片
Image image = Image.getInstance("C:/Users/gxk/Pictures/Saved Pictures/nvm.png");
image.setAlignment(Element.ALIGN_CENTER);
......@@ -112,7 +150,7 @@ public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements Bo
image.scalePercent(60);
document.add(image);
// close
// 关闭
document.close();
return document;
}
......@@ -173,11 +211,11 @@ public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements Bo
table.addCell(document.createCenterCell("测试详情"));
PdfPCell cell = new PdfPCell();
cell.addElement(document.createTextAndImageCell(pdfTestVO.getTestDetails()));
cell.addElement(document.createTextInImageCell(pdfTestVO.getTestDetails()));
Image img = Image.getInstance("C:/Users/gxk/Pictures/Saved Pictures/nvm.png");
img.scaleToFit(100, 100);
cell.addElement(img);
cell.addElement(document.createTextAndImageCell("车辆采用白名单策略,需客户端设置IP地址为192.168.69.71/24才可以与之通信,车辆IP地址为192.168.69.8。"));
cell.addElement(document.createTextInImageCell("车辆采用白名单策略,需客户端设置IP地址为192.168.69.71/24才可以与之通信,车辆IP地址为192.168.69.8。"));
Image imgTwo = Image.getInstance("C:/Users/gxk/Pictures/Saved Pictures/123.jpg");
img.scaleToFit(100, 100);
cell.addElement(imgTwo);
......
......@@ -84,12 +84,12 @@ public class BookController extends BaseController {
public void download(HttpServletResponse response) {
response.setHeader("content-disposition","attachment;fileName="+"ReceiptPrinter.pdf");
try {
// demo-API选软
// bookService.generateItextPdfDocument(response.getOutputStream());
// demo-API渲染
bookService.generateItextPdfDocument(response.getOutputStream());
// demo-模板
// bookService.generateTempPDF(response);
// demo-动态表格
bookService.testGeneratePDF(response.getOutputStream());
// bookService.testGeneratePDF(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
......
package com.ruoyi.common.utils;
import com.google.common.collect.ListMultimap;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
......@@ -8,10 +9,8 @@ import com.itextpdf.text.pdf.PdfWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
......@@ -265,34 +264,49 @@ public class PdfBaseWriter extends Document{
cell.setBorderColor(GREY_COLOR);
return cell;
}
/**
* 创建内容为图片的单元格 {@link PdfPCell}
* @param bgColor 背景 {@link BaseColor}
* @param border 边框 {@link Rectangle}
* @param align 对齐方式 {@link Element}
* @param colspan 所占列数
* @param rowspan 所占行数
* @param image 内容(文字或图片对象) {@link Image}
* @param fitWidth 宽度自适应
* @param fitHeight 高度自适应
* @return 单元格 {@link PdfPCell}
*/
public PdfPCell newPdfPCellOfImage(BaseColor bgColor, int border, int align, int colspan, int rowspan, Image image) {
public PdfPCell newPdfPCellOfImage(int colspan, int rowspan, Image image, float fitWidth, float fitHeight) {
PdfPCell cell = new PdfPCell();
cell.setBorderColor(BaseColor.BLACK);
cell.setBorderColorLeft(BaseColor.BLACK);
cell.setBorderColorRight(BaseColor.BLACK);
cell.setBackgroundColor(bgColor);
cell.setBorder(border);
cell.setUseAscender(Boolean.TRUE);
cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setBorder(Rectangle.BOX);
cell.setBorderColor(BaseColor.GRAY);
cell.setBackgroundColor(BaseColor.WHITE);
cell.setColspan(colspan);
cell.setRowspan(rowspan);
image.scaleToFit(fitWidth, fitHeight);
cell.addElement(image);
return cell;
}
/**
* 把图文混合写入单元格
* @param list
* @param table
* @return
*/
public PdfPCell writeTextAndImageCell(List<String> list, PdfPTable table) throws DocumentException, IOException {
PdfPCell cell = new PdfPCell();
cell.setBorderColor(BaseColor.GRAY);
for (String value : list) {
if (value.contains("/") && (value.endsWith(".jpg") || value.endsWith(".png") || value.endsWith(".jpeg"))) {
Image image = Image.getInstance(value);
cell.addElement(image);
} else {
cell.addElement(createTextInImageCell(value));
}
}
table.addCell(cell);
return cell;
}
//------------------------------------文本内容------------------------------------
......@@ -588,7 +602,7 @@ public class PdfBaseWriter extends Document{
* @throws IOException
* @throws DocumentException
*/
public Phrase createTextAndImageCell(String content) throws IOException, DocumentException {
public Phrase createTextInImageCell(String content) throws IOException, DocumentException {
return new Phrase(content, defaultFont());
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment