package com.test.springboot.pdfutils;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.test.springboot.commons.NumUtil;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
/**
*PDF生成器,依赖包
<!-- 生成pdf要用的jar -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
<!-- pdf输出中文要用的jar -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!-- 设置pdf的打开密码要用的jar -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.54</version>
</dependency>
**/
@Slf4j
public class PDFGenerator {
private static BaseFont baseFont;
private static Font font;
private static final String tempFilePath = "E:/java-project/code-case/test.pdf";
private static FileOutputStream originFos;
static {
}
public static void main(String[] args) {
try {
createDoc();
} catch (Exception e) {
e.printStackTrace();
log.info("创建doc是失败,===>{}", e.getMessage());
}
}
private static void createDoc() throws DocumentException, IOException {
PdfWriter writer;
Document doc = new Document(PageSize.A4);
try {
originFos = new FileOutputStream(tempFilePath);
writer = PdfWriter.getInstance(doc, originFos);
} catch (FileNotFoundException e) {
log.info("生成文件路径不存在异常信息:FileNotFoundException, ===>{}", e.getMessage());
e.printStackTrace();
throw new FileNotFoundException(e.getLocalizedMessage());
} catch (DocumentException e) {
log.info("文档异常信息:DocumentException, ===>{}", e.getMessage());
e.printStackTrace();
throw new DocumentException(e.getMessage());
}
doc.open();
initContent(doc);
try {
addImgWaterMark(doc);
} catch (IOException e) {
log.info("添加水印IO异常信息:IOException, ===>{}", e.getMessage());
e.printStackTrace();
throw new IOException(e.getMessage());
}
//给文件添加水印时必须关闭文件
addTable(writer);
doc.close();
originFos.close(); //关闭流,不然删除不了文件
addTextWaterMark(doc, tempFilePath);
delFile(tempFilePath);
writer.close();
}
private static void addTable(PdfWriter writer) {
PdfContentByte content = writer.getDirectContent();
PdfPTable table = new PdfPTable(4);
table.setTotalWidth(500f);
PdfPCell cell1 = new PdfPCell();
cell1.setColspan(4);
cell1.setBackgroundColor(BaseColor.CYAN);
cell1.setFixedHeight(30);
Paragraph p1 = new Paragraph("设置表头", new Font(baseFont, 16, Font.BOLD));
p1.setAlignment(1);
cell1.addElement(p1);
PdfPCell cell2 = new PdfPCell();
PdfPCell cell3 = new PdfPCell();
PdfPCell cell4 = new PdfPCell();
PdfPCell cell5 = new PdfPCell();
cell2.addElement(new Paragraph("详细信息", new Font(baseFont, 14, Font.NORMAL)));
cell3.addElement(new Paragraph("详细信息", new Font(baseFont, 14, Font.NORMAL)));
cell4.addElement(new Paragraph("详细信息", new Font(baseFont, 14, Font.NORMAL)));
cell5.addElement(new Paragraph("详细信息", new Font(baseFont, 14, Font.NORMAL)));
table.addCell(cell1);
table.addCell(cell2);
table.addCell(cell3);
table.addCell(cell4);
table.addCell(cell5);
table.writeSelectedRows(0, -1, 30, 265, content);
}
private static void addTextWaterMark(Document doc, String originName) throws IOException, DocumentException {
//指定最终文件名
String fileName = originName.substring(0, originName.lastIndexOf("/") + 1) + NumUtil.getDateNum() + ".pdf";
FileOutputStream fos;
PdfReader reader;
PdfStamper stamper;
try {
fos = new FileOutputStream(fileName);
} catch (FileNotFoundException e) {
log.info("添加文字水印生成新文件不存在异常:===>{}", e.getMessage());
e.printStackTrace();
delFile(tempFilePath);
throw new FileNotFoundException(e.getMessage());
}
try {
reader = new PdfReader(originName);
stamper = new PdfStamper(reader, fos);
} catch (IOException e) {
log.info("添加文字水印原文件异常:===>{}", e.getMessage());
e.printStackTrace();
delFile(tempFilePath);
throw new IOException(e.getMessage());
} catch (DocumentException e) {
log.info("PdfStamper异常:===>{}", e.getMessage());
e.printStackTrace();
delFile(tempFilePath);
throw new DocumentException(e.getMessage());
}
PdfContentByte content = stamper.getUnderContent(1);
content.beginText();
content.setColorFill(new BaseColor(211, 211, 211));
content.setFontAndSize(baseFont, 38);
content.setTextMatrix(1, 1);// 文字水印 起始位置
content.showTextAligned(Element.ALIGN_CENTER, "绝密文件, 请勿泄露", doc.getPageSize().getWidth() / 2, doc.getPageSize().getHeight() / 2, 45);
content.endText();
stamper.close();
reader.close();
}
private static void addImgWaterMark(Document doc) throws DocumentException, IOException {
final float docWidth = doc.getPageSize().getWidth();
final float docHeight = doc.getPageSize().getHeight();
URL url = PDFGenerator.class.getClassLoader().getResource("img/cherry.png");
String imgPath = url.getFile();
Image img;
try {
img = Image.getInstance(imgPath);
} catch (BadElementException e) {
log.info("水印图片元素异常信息提示:BadElementException,===>{}", e.getMessage());
e.printStackTrace();
delFile(tempFilePath);
throw new BadElementException(e.getMessage());
} catch (IOException e) {
log.info("水印图片IO异常信息提示:IOException,===>{}", e.getMessage());
e.printStackTrace();
delFile(tempFilePath);
throw new IOException(e.getMessage());
}
img.setAbsolutePosition(docWidth - img.getPlainWidth(), docHeight - img.getPlainHeight());
doc.add(img);
}
private static void initContent(Document document) throws DocumentException {
Paragraph pa = new Paragraph("热爱劳动,从我做起", new Font(baseFont, 14, Font.BOLD));
pa.setAlignment(1);
pa.setSpacingAfter(15);
document.add(pa);
Paragraph p1 = new Paragraph("大家好!今天我演讲的题目是《热爱劳动,从我做起》。", font);
p1.setFirstLineIndent(25);
document.add(p1);
p1 = new Paragraph("民生在勤,勤则不匮”,劳动是财富的源泉,也是幸福的源泉。宋范成大《四时田园杂兴》诗云“" +
"昼出耘田夜绩麻,村庄儿女各当家。童孙未解供耕织,也傍桑阴学种瓜。”与毛岸英的谈话中也曾说过:“你在苏联的大学毕业" +
"了,这很好,但学的是书本上的知识,可以说这只是知识的一半。你还需要上一个大学,就是劳动大学。” 可见,不管是古代还是现在," +
"不管是诗人还是政治家,都很重视劳动。", font);
p1.setFirstLineIndent(25);
document.add(p1);
p1 = new Paragraph("“夙兴夜寐,洒扫庭内”,热爱劳动是中华民族的优秀传统,绵延至今。作为学生,劳动可能并不直接创造" +
"财富,但可以培养优良品质。可是现实生活中,也有一些同学不理解劳动,不愿意劳动。有的说:“我们学习这么忙,劳动太占时间了!”" +
"真是这样么?", font);
p1.setFirstLineIndent(25);
document.add(p1);
p1 = new Paragraph("我们学习的是科学文化知识,而劳动也是科学文化的源泉。古有鲁班造锯,现有杂交水稻。现代科技,再" +
"也不是“四体不勤,五谷不分”的人闭门造车的产物,你看袁隆平,为了研究杂交水稻,吃住在田间地头,才解决了几亿人的温饱问题,现在又" +
"研究出了海水稻,离开一线劳动,这些都是不可想象的。学习怎么能离得开劳动?劳动是最好的学校!", font);
p1.setFirstLineIndent(25);
document.add(p1);
p1 = new Paragraph("有的说:“科技进步这么快,劳动的事,以后可以交给人工智能啊!”那现在呢?人工智能就不需要人工操作" +
"了吗?可见,这种论调也是站不住脚的。霍金不能说话,要靠一个电子设备发声,但也离不开两个指头的敲击。人工智能是机器的高级阶段,但" +
"制造工具的是人,最终操作工具的也是人。随着科技的进步,人类出现了两极分化的现象——制造工具的越来越聪明,但使用工具的越来越“愚蠢”。" +
"后者往往容易被工具“反制”,而一旦离开了所谓的高级工具,就会成为一个 “废人”,一定要警惕!", font);
p1.setFirstLineIndent(25);
document.add(p1);
p1 = new Paragraph("也有的说:“劳动这么苦,这么累,干吗非得自己干?花点钱让别人去做好了!”这也是为自己的懒惰找借口!别" +
"人能干,你为什么就不能干?今天你坐办公室,明天你就保证不去送外卖?不要歧视劳动,更不要歧视劳动者。劳动者最光荣!人类的进化,固然是出" +
"于大脑的发达,但也有赖于肢体的完善。“头脑简单,四肢发达”固然偏颇,但“头脑发达,四肢萎缩”也不可取,那跟一台座机有何分别?我想没有人会" +
"要那样的人生,你看看那么多体育明星和他们的粉丝就知道了。", font);
p1.setFirstLineIndent(25);
document.add(p1);
p1 = new Paragraph("当然,我们身边也还有着一些不尊重劳动的现象。既不尊重劳动者,也不尊重别人的劳动成果,特别是破坏公共卫生。" +
"这是认识问题,更是品质问题。我们要切实改变观念,从我做起,从现在做起,做一个爱劳动的人,为社会创造财富,为自己赢得幸福!", font);
p1.setFirstLineIndent(25);
document.add(p1);
}
private static void delFile(String path) {
File file = new File(path);
boolean f;
if(file.exists()) {
f = file.delete();
System.out.println(f);
}
}
}