第一次写相关文档保留记录下:(还在上班就匆匆写完)
本身一个春接口服务项目,因为和移动端有交互请求和业务限制,需要GDP 把pdf文件通过后端收到请求后加水印,然后再再下游平台图片格式展示。
起始思路是把pdf文件前端下载后通过前端组件转换后通传值下游,因为需要操作员点击移动端操作之后才能加水印有相关逻辑。只能后端处理:
相关代买:
package shuiyin;
import java.io.File;
import java.io.FileOutputStream;
import com.itextpdf.io.IOException;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
public class doTranPdf {
public static void waterMark(String inputFilePath,
String outputFilePath, String waterMarkContent) throws IOException, java.io.IOException {
FileOutputStream outputStream = new FileOutputStream(new File(outputFilePath));
PdfWriter pdfWriter = new PdfWriter(outputStream);
PdfDocument outDocument = new PdfDocument(pdfWriter);
PdfReader pdfReader = new PdfReader(inputFilePath);
PdfDocument redDocument = new PdfDocument(pdfReader);
// 添加事件,该事件拥有添加水印
WaterMarkHandler waterMarkHandler = new WaterMarkHandler(waterMarkContent);
outDocument.addEventHandler(PdfDocumentEvent.INSERT_PAGE, waterMarkHandler);
//获取总页数
int numberOfPages = redDocument.getNumberOfPages();
for (int i = 1; i <= numberOfPages; i++) {
PdfPage page = redDocument.getPage(i);
//复制每页内容添加到新的文件中
outDocument.addPage(page.copyTo(outDocument));
}
outDocument.close();
redDocument.close();
pdfReader.close();
}
/**
pdf加水印后转图片功能
**/
public static void pdfToImage(){
File file = new File("C:/Users/Lenovo/Desktop/20210726082316/2021072021263900072Fu.pdf");
try {
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for(int i=0; i<pageCount; i++){
BufferedImage image = renderer.renderImage(i, 2.5f);//这一步 应用的jar ,fontbox,jar中选择 与pdfbox版本靠近的 不然有个
// fontbox_2.0 之前的 用jar 中引用的 是fontmetric 和 而在之后版本中才用fontmetrics
// BufferedImage image = renderer.renderImageWithDPI(i,296);
ImageIO.write(image,"PNG",new File("e:/image/"+i+".png"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException, java.io.IOException {
waterMark("C:/Users/Lenovo/Desktop/20210726082316/2021072021263900072.pdf", "C:/Users/Lenovo/Desktop/20210726082316/2021072021263900072Fu.pdf", "love_2019");
}
}
=======================一下处理水印========================
package shuiyin;
/**
* 监听事件 添加水印
*/
public class WaterMarkHandler implements IEventHandler {
private String waterMarkContent = "";
public WaterMarkHandler(String str){
this.waterMarkContent = str;
}
@Override
public void handleEvent(com.itextpdf.kernel.events.Event event) {
PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;
PdfDocument document = documentEvent.getDocument();
PdfPage page = documentEvent.getPage();
Rectangle pageSize = page.getPageSize();
JLabel label = new JLabel();
label.setText(this.waterMarkContent);
label.getFontMetrics(label.getFont());
FontMetrics metrics = label.getFontMetrics(label.getFont());
int textHeight = metrics.getHeight();
int textWidth = metrics.stringWidth(label.getText());
PdfFont pdfFont = null;
try {
// 将字体包拖到路径下 /pdf/main/Font.ttf
try {
pdfFont = PdfFontFactory.createFont("/pdf/main/Font.ttf",PdfEncodings.IDENTITY_H,
false);
} catch (java.io.IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
//Canvas对象过期了,可以使用Document对象
Document document1 = new Document(document)
.setFont(pdfFont) //设置字体
.setFontColor(Color.convertRgbToCmyk(new DeviceRgb(java.awt.Color.LIGHT_GRAY))) //字体颜色
.setFontSize(16); //字体大小
//循环添加水印-posX表示横向起始位置,从左向右。posY表示纵向起始位置,从下到上。
for(float posX = 75f; posX < pageSize.getWidth(); posX = posX + textWidth * 3){
for(float posY = 50f; posY < pageSize.getHeight(); posY = posY + textHeight * 4){
/*document1.showTextAligned(new Paragraph(this.waterMarkContent), posX, posY, document.getPageNumber(page),
TextAlignment.CENTER, VerticalAlignment.MIDDLE, 145);*/
document1.showTextAligned(this.waterMarkContent,posX,posY,TextAlignment.CENTER, 145f);
}
}
}
}
涉及的jar 在下列链接中或者本人的上传资源中