Java操作PDF,在PDF文件指定位置输出水印

需要参考我的上一篇博客,定位PDF中的关键字,找出需要打印水印的坐标位置。

先说测试结果(PDF原件也是上一篇中的图片所示):

新生成的带有水印的PDF文件如下所示:

junit测试代码及输出:

maven配置文件

<!-- 引入pdf -->
    <dependency>
      <groupId>com.itextpdf</groupId>
      <artifactId>itextpdf</artifactId>
      <version>5.5.13</version>
    </dependency>

打印水印java文件PDFDocHelper.java

package com.alphajuns.util;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @Author AlphaJunS
 * @Date 19:25 2020/3/7
 * @Description 文档帮助类
 */
public class PDFDocHelper {
    private static BaseFont base = null;
    // 获取基础文字
    public static BaseFont getBaseFont() throws DocumentException, IOException {
        if (base == null) {
            try {
                base = BaseFont.createFont("/u01/config/simsun.ttc,1",  BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            } catch (Throwable th) {
                base = BaseFont.createFont("C:\\WINDOWS\\Fonts\\SIMSUN.TTC,1",  BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            }
        }
        return base;
    }

    //psw文件签名
    public static String signPsw(String oldPswFilePath, List<Map<String, ?>> reviews) throws IOException, DocumentException {
        int pos = oldPswFilePath.lastIndexOf(‘.‘);
        // 获取文件后缀
        String suffix = oldPswFilePath.substring(pos + 1);
        // 判断是否为pdf文件
        if (!"pdf".equals(suffix.toLowerCase())) {
            throw new RuntimeException("Not supported PSW file");
        }
        return signSinglePsw(oldPswFilePath, reviews);
    }

    //单个psw文件签名
    private static String signSinglePsw(String oldPswFilePath,List<Map<String, ?>> reviews) throws IOException, DocumentException {
        String newPswPath = oldPswFilePath;
        int pos = oldPswFilePath.lastIndexOf(‘.‘);
        // 获取文件后缀名
        String suffix = oldPswFilePath.substring(pos + 1);
        // 生成新的文件路径
        newPswPath = oldPswFilePath.substring(0, pos) + ".PSW." + suffix;
        System.out.println("单个psw文件签名生成的新路径:" + newPswPath);

        PdfReader reader = new PdfReader(oldPswFilePath);
        FileOutputStream fout = new FileOutputStream(newPswPath);
        PdfStamper stp = new PdfStamper(reader, fout);

        // 总页数
        System.out.println("PDF总页数:" + reader.getNumberOfPages());

        for (int i = 0; i < reader.getNumberOfPages(); ) {
            // 需要从第一页开始,i放在循环中会报空指针异常
            i++;
            PdfContentByte content = stp.getOverContent(i);
            content.beginText();

            // 设置字体及字号
            content.setFontAndSize(getBaseFont(), 10);

            Map<String, Object> review = (Map<String, Object>) reviews.get(reviews.size() - 1);
            addDeptReview(content, review);
            content.endText();
        }

        stp.close();
        // 将输出流关闭
        fout.close();
        reader.close();
        // 文件读写结束
        System.out.println("PSW文件读写完毕");

        return newPswPath;
    }

    /**
     * @Author AlphaJunS
     * @Date 18:48 2020/3/7
     * @Description 添加水印
     * @param content
     * @param review
     * @return void
     */
    private static void addDeptReview(PdfContentByte content, Map<String, Object> review) {
        if (Integer.parseInt(String.valueOf(review.get("type"))) == 1) {
            content.setColorFill(BaseColor.BLUE);
        } else {
            content.setColorFill(BaseColor.RED);
        }
        // 设置水印位置和内容
        String result = (String) review.get("result");
        System.out.println("水印内容:" + result);
        System.out.println("打印位置坐标:" + pswX[0] + "," + pswY[0]);
        content.showTextAligned(Element.ALIGN_LEFT, result, pswX[0], pswY[0], 0);
    }

    // 打印水印坐标
    private static float[] pswY = {128};
    private static float[] pswX = {337};

}

原文地址:https://www.cnblogs.com/alphajuns/p/12436389.html

时间: 2024-10-09 11:24:42

Java操作PDF,在PDF文件指定位置输出水印的相关文章

利用RandomAccessFile类在指定文件指定位置插入内容

package File; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; /*利用RandomAccessFile类在指定文件指定位置插入内容.*/ public class InsertContent { public static void ins

java操作office和pdf文件java读取word,excel和pdf文档内容

在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应用.如果想深入了解原理.请读者自行研究一些相关源码. 首先我们来认识一下读取相关文档的jar包: 1. 引用POI包读取word文档内容 poi.jar 下载地址 http://apache.freelamp.com/poi/release/bin/poi-bin-3.6-20091214.zip 

测试python awk sed 读取文件指定位置时的性能

#!/bin/env python #coding:utf8 ''' awk 打印指定行数 sed 打印指定行数 python 打印指定位置,某长度字符串 awk 耗时最长,很长 sed awk 时间一半 python 耗时 基本忽略不计 使用脚本监控日志文件的时候,每次记录上次退出的位置 python效率最高. ''' import os from  time import time from os.path import getsize testfile='/dev/shm/%s' % ti

使用C语言在Win控制台中实现指定位置输出

在古老的Turbo C中有个GotoXY可以让你在指定坐标中输出文字,可恨的是我看过的C语言书籍,有一半都是关于它的.我现在用着Windows系统,不可能还让我去写着DOS程序啊,起码也得从Win控制台程序开始啊.于是搜罗N多资料,终于找到一个Windows控制台程序API可以实现跳转到指定位置中进行输出. #include <stdio.h> #include <Windows.h> #include <conio.h> #include <stdlib.h&g

Java程序员从笨鸟到菜鸟之(一百零三)java操作office和pdf文件(一)java读取word,excel和pd

在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下java对word.excel.pdf文件的读取.本篇博客只是讲解简单应用.如果想深入了解原理.请读者自行研究一些相关源码. 首先我们来认识一下读取相关文档的jar包: 1. 引用POI包读取word文档内容 poi.jar 下载地址 http://apache.freelamp.com/poi/release/bin/poi-bin-3.6-20091214.ziph

java操作FTP,实现文件上传下载删除操作

上传文件到FTP服务器: /** * Description: 向FTP服务器上传文件 * @param url FTP服务器hostname * @param port FTP服务器端口,如果默认端口请写-1 * @param username FTP登录账号 * @param password FTP登录密码 * @param path FTP服务器保存目录 * @param filename 上传到FTP服务器上的文件名 * @param input 输入流 * @return 成功返回t

Head first java chapter 14 序列化和文件的输入/输出

java向python ,text文件动态传参或传值问题完美解决

由于业务需要对python文件进行参数传递,通过下面两个java方法完美解决此问题,我的思路是:首先我要先把上次写的参数删除,第二我要新的参数写到python文件中. 第一个方法解决了删除上次传递的参数问题. 第二个方法解决了参数传递到python文件 /** * @param file python文件的路径 * @return * @throws IOException */ private List<String> readAndRemoveFirstLines(File file) t

史林枫:C#.NET利用ffmpeg操作视频实战(格式转换,加水印 一步到位)

ffmpeg.exe是大名鼎鼎的视频处理软件,以命令行参数形式运行.网上也有很多关于ffmpeg的资料介绍.但是在用C#做实际开发时,却遇到了几个问题及注意事项,比如如何无损处理视频?如何在转换格式的同时添加水印,以提升处理效率?,ffmpeg的版本应该选择什么版本?.今天史林峰将用实战的方式来探索C#操作ffmpeg的奥秘. 关于ffmpeg的使用及其参数命令,这里就不做过多介绍了.主要以项目实战中为主. 因工作需要,笔者手头有近300部短视频需要处理,在网上找了不少工具,虽然能用,但是用起来