Java使用pdfbox实现给pdf文件加图片水印

目录
  • 引入依赖
  • 代码
  • 效果

引入依赖

<dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.27</version>
        </dependency>

代码

调节参数:图片宽高,旋转角度,几行几列 等等

package sjp.demo.workutils.utils;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.blend.BlendMode;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;

import java.io.File;
import java.io.IOException;

public class PdfUtils {

    public static void main(String[] args) throws IOException {
        String file = "D:\\workspaces\\demo\\sjp-work-utils\\src\\main\\resources\\pdf\\阿拉丁统计平台SDK接入指南.pdf";
        String imgPath = "D:\\workspaces\\demo\\sjp-work-utils\\src\\main\\resources\\imgs\\logo.png";
        addImgWatermark(file, imgPath);

    }

    public static void addImgWatermark(String filePath, String imgPath) throws IOException {
        String name = filePath.substring(filePath.lastIndexOf(File.separator), filePath.lastIndexOf(".pdf"));
        String folder = filePath.substring(0, filePath.lastIndexOf(File.separator));
        File file = new File(filePath);
        try (PDDocument doc = PDDocument.load(file)) {
            PDImageXObject pdImage = PDImageXObject.createFromFile(imgPath, doc);

            WatermarkOptions options = new WatermarkOptions()
                    .size(120, 60)
                    .padding(20)
                    .layout(4, 3)
                    // 建议0-90度
                    .rotate(30);

            for (PDPage page : doc.getPages()) {
                addImgWatermark(doc, page, pdImage, options);
            }
            doc.save(folder + File.separator + name + "_WaterMark.pdf");
        }

    }

    private static void addImgWatermark(PDDocument doc, PDPage page, PDImageXObject pdImage, WatermarkOptions options) throws IOException {
        try (
                PDPageContentStream cs = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true)
        ) {
            float width = page.getMediaBox().getWidth();
            float height = page.getMediaBox().getHeight();
//            System.out.println("width=" + width + ",height=" + height);

            //有一些pdf页面是有角度翻转的,修正一下
            int rotation = page.getRotation();
//            System.out.println("page.getRotation()=" + rotation);
            switch (rotation) {
                case 90:
                    width = page.getMediaBox().getHeight();
                    height = page.getMediaBox().getWidth();
                    cs.transform(Matrix.getRotateInstance(Math.toRadians(90), height, 0));
                    break;
                case 180:
                    cs.transform(Matrix.getRotateInstance(Math.toRadians(180), width, height));
                    break;
                case 270:
                    width = page.getMediaBox().getHeight();
                    height = page.getMediaBox().getWidth();
                    cs.transform(Matrix.getRotateInstance(Math.toRadians(270), 0, width));
                    break;
                default:
                    break;
            }

            PDExtendedGraphicsState gs = new PDExtendedGraphicsState();
            gs.setNonStrokingAlphaConstant(0.2f);// 设置透明度
            gs.setAlphaSourceFlag(true);
            gs.setBlendMode(BlendMode.NORMAL);
            cs.setGraphicsStateParameters(gs);

            int row = options.row;
            int column = options.column;
            float imgWidth = options.width;
            float imgHeight = options.height;
            float padding = options.padding;
            int degree = options.degree;

            // 计算获得每个单元格的宽高
            float cellWidth = (width - padding * 2) / column;
            float cellHeight = (height - padding * 2) / row;
//            System.out.println("cellWidth=" + cellWidth + ",cellHeight=" + cellHeight);

            // 偏移量,如果单元格宽高大于图片宽高,这可以使图片居中
            float xOffset = padding + (cellWidth - imgWidth) / 2;
            float yOffset = padding + (cellHeight - imgHeight) / 2;

            float x;
            float y;
            for (int i = 0; i < row; i++) {
                y = i * cellHeight + yOffset; 

                for (int j = 0; j < column; j++) {
                    x = j * cellWidth + xOffset;

                    // 旋转导致的x位置修正
                    x += Math.sin(Math.toRadians(degree)) * imgHeight;

//                    System.out.println((int) x + "," + (int) y);

                    Matrix matrix = new Matrix();
                    // 先移位
                    matrix.translate(x, y);
                    // 旋转
                    matrix.rotate(Math.toRadians(degree));
                    // 修改尺寸(必须在旋转后面,否则会变形)
                    matrix.scale(imgWidth, imgHeight);

                    // 画图
                    cs.drawImage(pdImage, matrix);
                }
            }

        }

    }

    static class WatermarkOptions {
        /**
         * 边距
         */
        float padding = 20;
        /**
         * 图片宽度
         */
        float width;
        /**
         * 图片高度
         */
        float height;
        /**
         * 旋转角度
         */
        int degree = 0;
        /**
         * 行数
         */
        int row = 1;
        /**
         * 列数
         */
        int column = 1;

        public WatermarkOptions() {

        }

        public WatermarkOptions padding(int p) {
            if (p < 10) {
                throw new IllegalArgumentException("边距不能小于0");
            }
            this.padding = p;
            return this;
        }

        public WatermarkOptions layout(int row, int column) {
            if (row <= 0 || column <= 0) {
                throw new IllegalArgumentException("行数或列数必须大于0");
            }
            this.row = row;
            this.column = column;

            return this;
        }

        public WatermarkOptions size(float width, float height) {
            this.width = width;
            this.height = height;
            return this;
        }

        public WatermarkOptions rotate(int degree) {
            this.degree = degree;
            return this;
        }

    }

}

效果

到此这篇关于Java使用pdfbox实现给pdf文件加图片水印的文章就介绍到这了,更多相关Java pdfbox添加图片水印内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java使用pdfbox操作pdf文件示例

    还有一个用于创建PDF文件的项目----iText. PDFBox下面有两个子项目:FontBox是一个处理PDF字体的java类库:JempBox是一个处理XMP元数据的java类库. 一个简单示例: 要引入pdfbox-app-1.6.0.jar这个包. 复制代码 代码如下: package pdf; import java.io.File;import java.net.MalformedURLException; import org.apache.pdfbox.pdmodel.PDDo

  • Java基于PDFbox实现读取处理PDF文件

    目录 前言 pdfbox介绍 开发环境 PDFbox依赖 快速开始 结语 前言 嗨,大家好,2022年春节已经接近尾声,各地都陆陆续续开工了.近期有朋友做一个小项目正好使用Java读取PDF文件信息.因此记录一下相关过程. pdfbox介绍 PDFbox是一个开源的.基于Java的.支持PDF文档生成的工具库,它可以用于创建新的PDF文档,修改现有的PDF文档,还可以从PDF文档中提取所需的内容.Apache PDFBox还包含了数个命令行工具. PDF文件的数据时一系列基本对象的集合:数组,布

  • Java给PDF加水印并合并多个文件

    目录 前言 准备环境 代码 添加依赖 工具类 测试 测试加水印与背景 测试pdf合并 总结 前言 本文基于itext7实现pdf加水印和合并的操作.实际上在我们实际项目应用中,对于pdf的操作也是比较常见的,我上一个项目中就有将结果转成pdf导出的需求. 准备环境 jdk8,idea2020.1.1,maven3 代码 添加依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all&

  • java pdf加水印的方法

    本文实例为大家分享了java pdf加水印的具体代码,供大家参考,具体内容如下 引入依赖 <dependency> <groupId>com.itextpdf.tool</groupId> <artifactId>xmlworker</artifactId> <version>5.5.10</version> </dependency> <dependency> <groupId>com

  • 利用java批量给pdf加水印的方法示例

    前言 最近因为工作需要,要批量在pdf上加水印,但找了一圈pdf在mac下的水印工具,都不太好用,索性就用java写一个吧. 以下代码依赖itext5.3.3包,java操作pdf 依靠itext5.3.3. 示例代码 //读取原来的pdf PdfReader reader = new PdfReader("/test/" + "1.pdf"); //生成以后的pdf PdfStamper stamp = new PdfStamper(reader, new Fil

  • Java使用pdfbox实现给pdf文件加图片水印

    目录 引入依赖 代码 效果 引入依赖 <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.27</version> </dependency> 代码 调节参数:图片宽高,旋转角度,几行几列 等等 package sjp.demo.workutils.utils; import

  • java利用pdfbox+poi往pdf插入数据

    目录 指定页码插入/替换 思路1(插入): 思路2(替换): 啰嗦几句 总结 指定页码插入/替换 pdfbox好像没有专门提供这个方法,但是现有的方法多重组合起来也能实现这个功能, 需求:一个pdf文件A有10页,现在想在第6页插入一页新的pdf文件B,插入完成后整个pdf文件A变成11页. 思路1(插入): 先将这个10的pdf拆分成10个1页的pdf,按顺序放好,文件名分别是:1.pdf.2.pdf....10.pdf.再拆分到第6页的时候将文件B放进来,重命名问6.pdf,原本pdf文件A

  • java根据富文本生成pdf文件过程解析

    这篇文章主要介绍了java根据富文本生成pdf文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 public class PdfUtil { /* * 生成pdf工具类 * wmy 12:40 2019/8/9 * @Param [guideBook, pdfPath] * @return java.lang.Boolean **/ public static Boolean htmlToPdf(GuideBook guideBook

  • C#实现PDF文件添加图片背景

    本文实例讲述了C#使用iTextSharp设置PDF所有页面背景图功能的方法.分享给大家供大家参考.具体如下: 在生成PDF 的时候,虽然可以在页面中设置背景图. 但有些内容过长夸页面的时候,就很难设置背景图,变成了空白背景的页面! 以下是重新生成每一页PDF背景图功能代码! public void SetPdfBackground(string pdfFilePath) { //重新生成的 PDF 的路径 string destFile = HttpContext.Current.Server

  • Python实现批量向PDF文件添加中文水印

    目录 前言 实现步骤 完整代码 前言 可以通过设置批量PDF文件所在的路径及需要添加的水印名称可以实现批量添加PDF水印的效果. 实现思路是这样的,通过在批量PDF文件路径下面生成一个带有水印的PDF模板.最后,将批量文件的每个PDF页面和水印模板进行合并完成批量添加水印的效果. 需要注意的是批量PDF文件必须和PDF模板水印文件的大小尺寸保持一致,这个可以在代码里面调节一下就成了. 实现步骤 首先将需要添加水印的PDF文件准备好放在一个文件夹下面. 在代码中设置好PDF批量文件的路径及水印名称

  • Python实现图片指定位置加图片水印(附Pyinstaller打包exe)

    (一)功能实现效果: 选择文件的效果: 标记预加水印的位置: (二)Python代码: # -*l- coding:utf-8 * import os, io, sys, re, time, json from pandas import array import matplotlib.backends.backend_tkagg import matplotlib matplotlib.use('TkAgg') import matplotlib.pyplot as plt #from mat

  • 如何使用C#在PDF文件添加图片印章

    文档中添加印章可以起一定的作用,比如,防止文件随意被使用,或者确保文档内容的安全性和权威性.C#添加图片印章其实也有很多实现方法,这里我使用的是免费的第三方软件Free Spire.PDF,向大家阐述如何以编程的方式在PDF文件中添加图片印章. 具体步骤如下: 在此之前,我们需要添加dll文件作为引用.添加引用 → 浏览 → Spire.XLS folder → Bin → .NET 2.0/3.5/4.0/4.5/4.0 ClientProfile → Spire.XLS.dll. 第一步:首

  • JavaScript+Java实现HTML页面转为PDF文件保存的方法

    需求是一个导出pdf的功能,多方奔走终于实现了,走了不少弯路,而且怀疑现在这个方法仍是弯的. 有个jsPDF 插件可以在前端直接生成pdf,很简便,但不支持IE. 前端: 首先引入  html2canvas.js html2canvas(document.body, { //截图对象 //此处可配置详细参数 onrendered: function(canvas) { //渲染完成回调canvas canvas.id = "mycanvas"; // 生成base64图片数据 var

  • C#如何给PDF文件添加水印

    水印种类及功能介绍 PDF水印分为两种:文本水印和图片水印.文本水印一般被用在商业领域,提醒读者该文档是受版权保护的,其他人不能抄袭或者免费使用.除了这个特征,水印还可以用来标记这个文档 的一些基本状态信息,例如是草稿状态还是最终版本?图片水印是美化PDF文件的一个很好的选择,它可以用多彩的.独特的图片来作为PDF文件的背景.那么,怎样用编程的方式给PDF文件 添加水印呢?有很多种实现方法,其中一种最快最容易的办法也许是用第三方软件,例如Spire.PDF.本文会阐述怎样用免费的第三方软件Spi

随机推荐