1. Obtenez le nombre de pages PDF
Ajoutez des dépendances Maven :
<!-- java获取Pdf文件页码 -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>1.8.11</version>
</dependency>
Code:
/**
* 获取pdf页数
* @author lgn
* @date 2023/6/13 10:29
* @return int
*/
public static int getFilePage(String pdfName) throws IOException {
int page=0;
//pdfName:pdf文件路径
try {
PDDocument pdDocument = PDDocument.load(pdfName);
page=pdDocument.getNumberOfPages();
} catch (IOException e) {
e.printStackTrace();
}
return page;
}
public static void main(String[] args) throws Exception {
/* System.out.println("begin");
PDFReport ppt = new PDFReport();
String url = ppt.testWritePdf();
System.out.println(url);
System.out.println("end");*/
String url="C:\\Users\\Administrator\\Desktop\\新建 DOC 文档.pdf";
System.out.println(getFilePage(url));
}
2. Obtenez du contenu texte PDF
dépendances maven :
<!-- java 识别pdf -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.23</version>
</dependency>
Implémentation des interfaces :
/**
* 获取pdf文字内容
*/
@PostMapping("uploadPDF")
public R<SysFile> uploadPDF(MultipartFile multipartFile) {
try
{
//multipartFile为multipartFile文件类型,将文件转化为文件流被PDDocument加载
PDDocument document = PDDocument.load(multipartFile.getInputStream());
document.getClass();
//使用PDFTextStripper 工具
PDFTextStripper tStripper = new PDFTextStripper();
//设置文本排序,有规则输出
tStripper.setSortByPosition(true);
//获取所有文字信息
String info = tStripper.getText(document);
System.out.println(info);
return R.ok();
}
catch (Exception e)
{
log.error("上传文件失败", e);
return R.fail(e.getMessage());
}
}
3. Java extrait les images des fichiers PDF
Introduisez les dépendances maven :
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf.free</artifactId>
<version>3.9.0</version>
</dependency>
<repositories>
<repository>
<id>com.e-iceblue</id>
<url>http://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
Code:
package com.ypk.swagger.utils.PDFUtils;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* 从 PDF 文档中提取图片
* @author lgn
* @date 2023/6/21 16:37
*/
public class PdfboxUtil {
public static void main(String[] args) throws IOException {
//创建 PdfDocument 类的对象
PdfDocument doc = new PdfDocument();
//载入PDF文档
doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\SY P-EM-02 A4 设备管理控制程序-.pdf");
//声明一个int变量
int index = 0;
//循环遍历所有页面
for (PdfPageBase page : (Iterable<PdfPageBase>) doc.getPages()) {
//从页面中提取图片
for (BufferedImage image : page.extractImages()) {
//指定文件路径和文件名
File output = new File("C:\\Users\\Administrator\\Desktop\\" + String.format("图片-%d.png", index++));
//将图片保存为PNG文件
ImageIO.write(image, "PNG", output);
}
}
}
}
4. Ajouter un filigrane au PDF
Ajoutez des dépendances Maven :
<dependency>
<groupId>com.itextpdf</groupId >
<artifactId>itextpdf</artifactId >
<version> 5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId >
<artifactId>itext-asian</artifactId>
<version> 5.2.0</version>
</dependency>
Outils:
package com.jeeplus.api.utils.pdf;
import com.itextpdf.text.Element;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import javax.swing.*;
import java.awt.*;
import java.io.FileOutputStream;
public class PDFAddWatermarkUtil {
/**
* 给PDF添加水印
* @param inputFile 原文件路径+名称
* @param outputFile 添加水印后输出文件保存的路径+名称
* @param waterMarkName 添加水印的内容
*/
public static void PDFAddWatermark(String inputFile,String outputFile, String waterMarkName) {
try {
// 水印的高和宽(参数可调节)
int textH = 75;
int textW = 170;
// 间隔距离(参数可调节)
int interval = 30;
// 切记这里的参数是文件的路径 ,路径必须是双斜杠的如F:\\test.pdf,不能是F:/test.pdf 或者F:\test.pdf
PdfReader reader = new PdfReader(inputFile);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.2f);//改透明度
gs.setStrokeOpacity(0.4f);
int total = reader.getNumberOfPages() + 1;
JLabel label = new JLabel();
label.setText(waterMarkName);
PdfContentByte under;
// 可添加多个水印
Rectangle pageRect = null;
FontMetrics metrics;
label.setText(waterMarkName);
metrics = label.getFontMetrics(label.getFont());
for (int i = 1; i < total; i++) {
pageRect = reader.getPageSizeWithRotation(i);
// 在内容上方加水印
under = stamper.getOverContent(i);
// 在内容下方加水印
//under = stamper.getUnderContent(i);
under.saveState();
under.setGState(gs);
under.beginText();
under.setFontAndSize(base, 20);
// 水印文字成30度角倾斜
for (int height = interval + textH; height < pageRect.getHeight();
height = height + textH * 3) {
for (int width = interval + textW; width < pageRect.getWidth() + textW;
width = width + textW * 2) {
under.showTextAligned(Element.ALIGN_LEFT
, waterMarkName, width - textW,
height - textH, 30);
}
}
// 添加水印文字
under.endText();
}
stamper.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
PDFAddWatermark("C:\\Users\\Administrator\\Desktop\\SY P-DC-01 A3 文件控制程序3.pdf", "C:\\Users\\Administrator\\Desktop\\新建 DOC 文档-shuiyin.pdf","作废保留");
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. Ajouter un filigrane aux fichiers PDF
<dependency>
<groupId>com.itextpdf</groupId >
<artifactId>itextpdf</artifactId >
<version> 5.5.9</version>
</dependency>
package com.jeeplus.api.utils.pdf;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.imageio.ImageIO;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
public class PdfInsertPhoto {
/**
* pdf插入图片
*
* @param oldPath 插入图片前的路径
* @param newPath 插入图片后的路径
* @param imgPath 图片路径
*/
public static void addImage(String oldPath, String newPath, String imgPath) throws IOException, DocumentException {
InputStream inputStream = Files.newInputStream(Paths.get(oldPath));
FileOutputStream out = new FileOutputStream(newPath);
PdfReader reader = new PdfReader(inputStream);
//pdf页数
int pdfPages = reader.getNumberOfPages();
PdfStamper stamper = new PdfStamper(reader, out);
//图片
BufferedImage bufferedImage = ImageIO.read(Files.newInputStream(Paths.get(imgPath)));
//x轴坐标
int x = 350;
//y轴坐标
int y = 520;//值越大越靠上
//图片放置的页码
for (int i = pdfPages; i <= pdfPages; i++) {
//图片处理
Image img = Image.getInstance(ImageUtil.imageToBytes((bufferedImage), "png"));
//设置图片大小
img.scaleAbsolute(192, 100);
img.setTransparency(new int[0]);
//设置图片位置
img.setAbsolutePosition(x, y);
stamper.getOverContent(1).addImage(img);//第一页插入图片
}
//关闭资源
stamper.close();
out.close();
reader.close();
}
public static void main(String[] args) throws IOException, DocumentException {
addImage("C:\\Users\\Administrator\\Desktop\\SY P-DC-01 A3 文件控制程序3.pdf","C:\\Users\\Administrator\\Desktop\\2.pdf","C:\\Users\\Administrator\\Desktop\\gaizhang.png");
}
}