Java operation pdf tool class

1. Get the number of pdf pages

Add maven dependencies:

        <!-- 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. Get pdf text content

maven dependencies:

        <!-- java 识别pdf -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.23</version>
        </dependency>

Interface implementation:

    /**
     * 获取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 extracts images from PDF files

Introduce maven dependencies:

Insert image description here

        <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. Add watermark to PDF

Add Maven dependencies:

        <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>

Tools:

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. Add watermark to PDF files

        <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");

    }
}

Guess you like

Origin blog.csdn.net/u010797364/article/details/131330818