[Java] 纯文本查看 复制代码
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.RandomUtil;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import org.apache.logging.log4j.util.Strings;
import org.xxx.xxx.base.pojo.PdfData;
import org.xxx.xxx.base.pojo.PdfInfo;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Objects;
/**
* [url=home.php?mod=space&uid=686208]@AuThor[/url] coderW
* [url=home.php?mod=space&uid=1248337]@version[/url] 1.0.0
* @Description
* @createTime 2022年11月14日 15:44:00
*/
public class PdfUtil {
/**
* todo demo
* 创建一个pdf文档的样例
* [url=home.php?mod=space&uid=952169]@Param[/url] outPath 输出路径
* @param content 内容集合
* @param titPath 字体
* @param pdfInfo pdf属性
* @throws IOException io
*/
public static void createPdf(String outPath, ArrayList<PdfData> content, String titPath, PdfInfo pdfInfo) throws IOException {
Document document = standA4Document();
try (OutputStream outputStream = Files.newOutputStream(Paths.get(outPath))) {
// 加载文档流
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
// 判断文档是否需要属性
if(Objects.nonNull(pdfInfo)){
setBaseInfo(document, pdfInfo.getAuthor(), pdfInfo.getKeywords(), pdfInfo.getProduct(), pdfInfo.getLink(), pdfInfo.getTitle(), pdfInfo.getSubject());
}
// 打开文档
document.open();
// 创建字体
Font font = createFont(titPath);
createFontStyle(font, 12f,null);
// 创建表 这里的数据模拟 从excel读取出来的数据
ArrayList<Object> header = new ArrayList<>();
header.add(" ");
header.add("月总辐射量(kWh/m2)");
header.add("月散射辐射(kWh/m2)");
header.add("月直射辐射(kWh/m2)");
header.add("平均气温(℃)");
ArrayList<ArrayList<Object>> tableBody = new ArrayList<>();
for (int i = 1; i <= 12; i++) {
ArrayList<Object> d1 = new ArrayList<>();
d1.add(i+"月");
d1.add(RandomUtil.randomDouble());
d1.add(RandomUtil.randomDouble());
d1.add(RandomUtil.randomDouble());
d1.add(RandomUtil.randomDouble());
tableBody.add(d1);
}
createTable(document,header,tableBody,font,getBaseColor(244,244,244),new float[]{50,150,150,150,110},PageSize.A4,30,30);
// 关闭文档
document.close();
// 关闭流
writer.close();
} catch (DocumentException e) {
e.printStackTrace();
}
}
/**
* 创建一个表格
* @param header 表头数据
* @param body 表数据
* @param font 字体
* @param headerBaseColor 表头背景颜色 可以为空
* @param colWidth 列宽度
* @param pageSize 表适配大小
* @param headerCellHeight 表头行高
* @param bodyCellHeight 表数据行高
* @throws DocumentException do
*/
public static void createTable(Document document,ArrayList<Object> header,
ArrayList<ArrayList<Object>> body,Font font,
BaseColor headerBaseColor,
float[] colWidth,
Rectangle pageSize,
float headerCellHeight,
float bodyCellHeight
) throws DocumentException {
PdfPTable pdfPTable = pdfPtable(header.size());
pdfPTable.setHorizontalAlignment(Element.ALIGN_CENTER);
if(colWidth != null){
pdfPTable.setWidthPercentage(colWidth,pageSize);
}
// 创建表头
if(CollectionUtil.isNotEmpty(header)){
createTableData(pdfPTable,header,font,headerBaseColor,headerCellHeight);
}
// 填充数据
if(CollectionUtil.isNotEmpty(body)){
for (ArrayList<Object> list : body) {
if(CollectionUtil.isNotEmpty(list)){
createTableData(pdfPTable,list,font,null,bodyCellHeight);
}
}
}
document.add(pdfPTable);
}
/**
* 添加表头
* @param table 表
* @param data 单元格数据
* @param font 字体
* @param cellHeight 行高
* @param baseColor 表头的背景颜色 如果不是表头可以不填写
*/
public static void createTableData(PdfPTable table,ArrayList<Object> data,Font font,BaseColor baseColor,float cellHeight) {
int numberOfColumns = table.getNumberOfColumns();
for (int i = 0; i < numberOfColumns; i++){
// 添加一个单元格
PdfPCell cell = new PdfPCell();
Paragraph elements = new Paragraph(data.get(i).toString(), font);
cell.addElement(elements);
// 设置行高
cell.setLeading(3,3);
// 设置字体居中
cell.setPaddingLeft(10);
cell.setFixedHeight(cellHeight);
cell.setVerticalAlignment(Element.ALIGN_CENTER);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
// 设置背景边框
if(baseColor != null){
cell.setBackgroundColor(baseColor);
}
table.addCell(cell);
}
}
/**
* 创建一个表格
* @param columns 列数
* [url=home.php?mod=space&uid=155549]@Return[/url] PdfPTable
*/
public static PdfPTable pdfPtable(int columns){
return new PdfPTable(columns);
}
/**
* 普通文本创建段落
* @param document pdf
* @param data 需要填充的文本
* @param font 字体
* @throws DocumentException do
*/
public static void fillText(Document document,String data,Font font) throws DocumentException {
Paragraph paragraph = createParagraph(font, data);
document.add(paragraph);
}
/**
* 基于对象的填充段落
* @param document 文档
* @param info 数据
* @param titPath 字体路径
* @param font 字体
* @throws DocumentException do
* @throws IOException io
*/
public static void fillText(Document document,PdfData info,String titPath,Font font) throws DocumentException, IOException {
if(Strings.isNotBlank(info.getTitle())){
Font titledFont = createTitledFont(titPath, 18f, Font.BOLD);
Paragraph p1 =createParagraph(titledFont,info.getTitle());
p1.setAlignment(Element.ALIGN_LEFT);
document.add(p1);
}
fillText(document,info.getData(),font);
}
/**
* 添加一张图片
* @param image 图片对象
* @param document 文档
* @throws DocumentException do
*/
public static void addImage(Image image, Document document) throws DocumentException {
setImage(image,100,60);
document.add(image);
}
/**
* 支持像素缩放 查看Image对象
* 按百分比缩放图片 对称缩放
* @param image 图片对象
* @param scalePercent 百分比
*/
public static void setImage(Image image,float scalePercent){
image.scalePercent(scalePercent);
image.setAlignment(Image.MIDDLE);
}
/**
* 百分比缩放
* @param image 图片对象
* @param scalePercentX 长缩放
* @param scalePercentY 宽缩放
*/
public static void setImage(Image image,float scalePercentX,float scalePercentY){
image.scalePercent(scalePercentX,scalePercentY);
image.setAlignment(Image.MIDDLE);
}
/**
* 创建一张图片
* @param path 路径
* @return Image
* @throws BadElementException ex
* @throws IOException io
*/
public static Image getImage(String path) throws BadElementException, IOException {
return Image.getInstance(path);
}
/**
* 写出数据
* @param content 数据
*/
public static void fillText( PdfContentByte content){
content.fill();
content.sanityCheck();
}
/**
* 创建字体
* @return Font
*/
public static Font createFont(){
return new Font();
}
/**
* 给字体设置样式
* @param font 字体
* @param fontSize 字体大小
* @param baseColor 字体颜色
* @param style 样式 Font.BOLD 等方法
*/
public static void createFontStyle(Font font,Float fontSize,BaseColor baseColor,Integer... style){
if(Objects.isNull(font)){
return;
}
font.setSize(fontSize);
if(baseColor != null){
font.setColor(baseColor);
}
if(style != null){
for (Integer integer : style) {
font.setStyle(integer);
}
}
}
/**
* 创建字体颜色
* @param red 红
* @param green 绿
* @param blue 蓝
* @return BaseColor
*/
public static BaseColor getBaseColor(Integer red,Integer green,Integer blue){
return new BaseColor(red,green,blue);
}
/**
* 创建指定字体的font
* @param fontPath font路径
* @return Font
* @throws DocumentException 文档异常
* @throws IOException io异常
*/
public static Font createFont(String fontPath) throws DocumentException, IOException {
BaseFont font = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
return new Font(font);
}
/**
* 添加标题大小的字体
* @param fontPath 字体路径
* @param size 大小
* @param style 样式
* @return Font
* @throws DocumentException dx
* @throws IOException io
*
* tip: createTitleFont(path,22,Font.BOLD)
*/
public static Font createTitledFont(String fontPath,float size,int style) throws DocumentException, IOException {
BaseFont font = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
return new Font(font, size, style);
}
/**
* 创建一个段落
* @param font 字体
* @param content 内容
* @return Paragraph
* @throws DocumentException 文档异常
*/
public static Paragraph createParagraph(Font font,String content) throws DocumentException {
Paragraph elements = new Paragraph(content, font);
// 设置首行缩进
elements.setFirstLineIndent(20f);
return elements;
}
/**
* 创建一个指定大小宽度的页面
* @param width 宽度
* @param height 高度
* @return Rectangle
*/
public static Rectangle createRectangle(Integer width,Integer height){
return new Rectangle(width,height);
}
/**
* 创建一个pdf
* @param pageSize pdf页大小对象
* @param marginLeft 距离左边边距
* @param marginRight 距离右边边距
* @param marginTop 距离上边边距
* @param marginBottom 距离下边边距
* @return Document
*/
public static Document createDocument(Rectangle pageSize,int marginLeft,int marginRight,int marginTop,int marginBottom){
return new Document(pageSize,marginLeft,marginRight,marginTop,marginBottom);
}
/**
* 创建一个标准的pdf
* // todo PageSize 内置很多样式大小
*
* @return Document
*/
public static Document standA4Document(){
return new Document(PageSize.A4);
}
/**
* pdf相关信息
*
* @param document pdf
* @param author 作者
* @param keywords 关键字
* @param product 产品
* @param link 官网连接
* @param title 标题
* @param subject 主题
*/
public static void setBaseInfo(Document document, String author, String keywords, String product, String link, String title, String subject){
document.addAuthor(author);
document.addCreationDate();
document.addKeywords(keywords);
Meta producer = new Meta("producer", product);
try {
document.add(producer);
} catch (DocumentException e) {
throw new RuntimeException(e);
}
document.addCreator(link);
document.addTitle(title);
document.addSubject(subject);
}
}