pdf 添加页眉页脚,获取前五页

news/2024/11/5 18:28:30 标签: pdf, java

test

java.">/**
 * 加水印、页眉、页脚
 */
@Test
void d1() throws IOException {
    //水印 样式调整
    String file = "D:\\test\\2\\GB1.pdf";
    PdfUtil.WatermarkPDF(file);
}
/**
 * 获取前五页
 */
@Test
void d2() throws IOException {
    String file = "E:\\test\\2\\3.pdf";
    PdfUtil.getPdfSs(file);
}

PdfUtil

java">package com.wlq.demo.uitls;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.text.TextPosition;
import org.apache.pdfbox.util.Matrix;
import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.springframework.core.io.ClassPathResource;

import java.io.*;

/**
 * @author csb
 * @description: TODO
 * @date 2023/11/20 17:05
 */
public class PdfUtil {

    public static void two (String in) throws IOException {
        // 加载PDF文件
        PDDocument document = PDDocument.load(new File(in));

        // 创建访问权限对象
        AccessPermission accessPermission = new AccessPermission();
        accessPermission.setCanPrint(true);
        accessPermission.setCanModify(false);
        accessPermission.setCanFillInForm(false);
        accessPermission.setCanExtractContent(false);

        // 创建保护策略对象
        StandardProtectionPolicy protectionPolicy = new StandardProtectionPolicy("password", "123456", accessPermission);

        // 应用保护策略到文档
        document.protect(protectionPolicy);

        PDType0Font font = PDType0Font.load(document, new File("D:\\test\\pdf\\11.ttf"));

        // 加水印 遍历每一页
        for (PDPage page : document.getPages()) {
            // 创建内容流以在页面上绘制文本
            PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true);

            // 设置字体、颜色和透明度
            contentStream.setFont(font, 36);
            contentStream.setNonStrokingColor(200, 200, 200); // 灰色
            contentStream.setLineWidth(5);

            // 计算水印位置(居中)
            float x = page.getMediaBox().getWidth() / 2;
            float y = page.getMediaBox().getHeight() / 2;

            // 添加水印文本
            contentStream.beginText();
            contentStream.newLineAtOffset(x, y);
            contentStream.showText("水印");
            contentStream.endText();

            // 关闭内容流并保存更改
            contentStream.close();
        }

        // 保存加密后的PDF文件
        document.save("D:\\test\\pdf\\22.pdf");

        // 关闭文档
        document.close();
    }

    public static void WatermarkPDF(String in) throws IOException {
        // 加载PDF文档
        PDDocument document = PDDocument.load(new File(in));

//        PDType0Font font = PDType0Font.load(document, new File("D:\\test\\pdf\\11.ttf"));
        PDType0Font font = PDType0Font.load(document, new ClassPathResource("/static/MC.ttf").getInputStream());
//        PDType1Font font = PDType1Font.HELVETICA_BOLD;
//        PDImageXObject image = PDImageXObject.createFromFile("D:\\test\\2\\logo.png", document);
        PDImageXObject image = PDImageXObject.createFromFileByExtension(new ClassPathResource("/static/logo.png").getFile(), document);

        float pageHeight = 0;
        float pageWidth = 0;
        float margin = 40;

        // 遍历每一页
        for (PDPage page : document.getPages()) {
            // 计算水印位置(居中)
            pageHeight = page.getMediaBox().getHeight();
            pageWidth = page.getMediaBox().getWidth();

            // 创建内容流以在页面上绘制文本
            PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true);

            // 设置字体、颜色和透明度
            contentStream.setFont(font, 18);
            contentStream.setNonStrokingColor(153, 153, 153); // 灰色
            contentStream.setLineWidth(5);
            // 设置水印透明度
            PDExtendedGraphicsState extendedGraphicsState = new PDExtendedGraphicsState();
            extendedGraphicsState.setNonStrokingAlphaConstant(0.8f);
            contentStream.setGraphicsStateParameters(extendedGraphicsState);

            // 添加水印文本
            contentStream.beginText();
            for (int h = 10; h < pageHeight; h = h + 250) {
                for (int w = -10; w < pageWidth; w = w + 200) {
                    contentStream.setTextMatrix(Matrix.getRotateInstance(0.7, w, h));
                    contentStream.showText("5555奶饼@163.com");
                }
            }
            contentStream.endText();
            contentStream.restoreGraphicsState();
            // 关闭内容流并保存更改
            contentStream.close();

            //添加页眉
            // 计算图片位置
            float imageWidth = image.getWidth() / 2;
            float imageHeight = image.getHeight() / 2;
            float x = margin + 20;
            float y = page.getMediaBox().getHeight() - imageHeight - margin;
            contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.PREPEND, true);
            contentStream.drawImage(image, x, y, imageWidth, imageHeight);
            contentStream.close();

            // 添加页脚
            contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.PREPEND, true);
            contentStream.setFont(font, 12);
            contentStream.setNonStrokingColor(51, 0, 0); // 灰色
            contentStream.beginText();
            contentStream.moveTextPositionByAmount(pageWidth - 350, margin);
            contentStream.drawString("STEM标准译文商城:https://client.mt.sunther.com/mall");
            contentStream.endText();
            contentStream.close();

        }

        // 保存带有水印的PDF文档
        document.save("D:\\test\\2\\GB16.pdf");

        // 关闭文档
        document.close();
    }

    public static void SetPdfPassword (String in){
        try {
            // 加载PDF文件
            PDDocument document = PDDocument.load(new File(in));

            // 创建访问权限对象
            AccessPermission accessPermission = new AccessPermission();
            accessPermission.setCanPrint(true);
            accessPermission.setCanModify(false);
            accessPermission.setCanFillInForm(false);
            accessPermission.setCanExtractContent(false);

            // 创建保护策略对象
            StandardProtectionPolicy protectionPolicy = new StandardProtectionPolicy("password", "123456", accessPermission);

            // 应用保护策略到文档
            document.protect(protectionPolicy);

//            // 保存加密后的PDF文件
            document.save("D:\\test\\pdf\\2.pdf");

            // 关闭文档
            document.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 截取PDF前五页
     */
    public static void getPdfSs (String in){
        try (PDDocument document = PDDocument.load(new File(in))) {
            if (document.getNumberOfPages() > 5) {
                // 截取前五页
                for (int i = document.getNumberOfPages() - 1; i >= document.getNumberOfPages() - 5; i--) {
                    PDPage page = document.getPage(i);
                    document.removePage(i);
                    if (i < 5){
                        document.addPage(page);
                    }
                }
            }

            // 保存修改后的文档
            document.save("E:\\test\\2\\GB456.pdf");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


http://www.niftyadmin.cn/n/5739753.html

相关文章

外包干了2年,快要废了。。

先说一下自己的情况&#xff0c;普通本科&#xff0c;在外包干了2年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会让一…

contenteditable实现需要一个像文本域一样的可编辑框

我这里是因为左上和右下有一个固定的模板&#xff0c;所有用textarea有点不方便&#xff0c;查了下还有一个方法可以解决就是在需要编辑的元素上加上 :contenteditable"true" 完整代码如下&#xff0c;因为这个弹窗是两用的&#xff0c;所以用messageType做了一下判…

系统安全架构

一个完整的信息安全系统至少包含三类措施: 技术方面的安全措施&#xff0c; 管理方面的安全措施 相应的政策法律。 网络安全威胁 授权侵犯&#xff1a;为某一特权使用一个系统的人却将该系统用作其他未授权的目的。假冒&#xff1a;一个实体(人或系统)假装成另一个实体非法…

HarmonyOS :

HarmonyOS 移动应用开发 什么是HarmonyOS&#xff1f;&#xff1a; 官方解释&#xff1a;HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。 鸿蒙操作系统在传统的单设备系统能力的基础上&#xff0c;提出了基于同一套系统能力、适配多种终端形态的分布式理念&#…

本地缓存与 Redis:为什么我们仍然需要本地缓存?

文章目录 本地缓存与 Redis&#xff1a;为何仍需本地缓存&#xff1f;为什么需要本地缓存&#xff1f;多级缓存架构多级缓存的实现 本地缓存的实现方式使用 cachetools 实现 LRUCache使用 diskcache 实现持久化缓存 缓存装饰器实现进一步优化&#xff1a;缓存失效与更新 小结 好…

硬件在环仿真建模之电路拓扑建模与数学建模

我们需要先明确一个问题&#xff0c;什么是电路拓扑式建模&#xff08;后面简称拓扑建模&#xff09;和数学建模&#xff1f; 电力电子系统的拓扑建模&#xff0c;从大类上都可以归入为物理式建模&#xff08;Physics-Based Modeling&#xff09;,物理式建模的最大特点就是用户…

新世联科技:NG2-A-7在DAC空气捕集提取CO2的应用

一、DAC空气捕集提取CO2的介绍 直接空气碳捕获&#xff08;Direct Air Capture&#xff0c;简称DAC&#xff09;是一种直接从大气中提取二氧化碳的技术。 二、DAC空气捕集提取CO2的前景 从大气中提取的这种二氧化碳可以作为循环经济的一部分以各种不同方式使用。未来&#xf…

【Java】常用类方法记录

Arrays类 java.util.Arrays 返回类型方法描述static <T> List<T>asList(T… a)返回由指定数组支持的固定大小的列表。static intbinarySearch(byte[] a, byte key)使用二进制搜索算法在指定的字节数组中搜索指定的值。static intbinarySearch(byte[] a, int fromIn…