首页 > 其他分享 >PDF合并和PDF加水印

PDF合并和PDF加水印

时间:2024-03-04 09:12:50浏览次数:20  
标签:String int 合并 水印 pdfContent 加水 new PDF

  1. maven
<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
/**
     * 水印
     * @param inputFilePath
     * @param outputFilePath
     * @param waterMarkContent
     */
    public static void pdfAddWaterMark(String inputFilePath, String outputFilePath, String waterMarkContent) {
        try {
            // 水印的高和宽
            int waterMarkHeight = 30;
            int watermarkWeight = 60;

            // 水印间隔距离
            int waterMarkInterval = 240;

            // 读取PDF文件流
            PdfReader pdfReader = new PdfReader(inputFilePath);

            // 创建PDF文件的模板,可以对模板的内容修改,重新生成新PDF文件
            PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outputFilePath));

            // 设置水印字体
            BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);

            // 设置PDF内容的Graphic State 图形状态
            PdfGState pdfGraPhicState = new PdfGState();
            // 填充透明度
            pdfGraPhicState.setFillOpacity(0.1f);
            // 轮廓不透明度
            pdfGraPhicState.setStrokeOpacity(0.2f);

            // PDF页数
            int pdfPageNum = pdfReader.getNumberOfPages() + 1;

            // PDF文件内容字节
            PdfContentByte pdfContent;

            // PDF页面矩形区域
            Rectangle pageRectangle;

            for (int i = 1; i < pdfPageNum; i++) {
                // 获取当前页面矩形区域
                pageRectangle = pdfReader.getPageSizeWithRotation(i);
                // 获取当前页内容,getOverContent表示之后会在页面内容的上方加水印
                pdfContent = pdfStamper.getOverContent(i);

                // 获取当前页内容,getOverContent表示之后会在页面内容的下方加水印
                // pdfContent = pdfStamper.getUnderContent(i);

                pdfContent.saveState();
                // 设置水印透明度
                pdfContent.setGState(pdfGraPhicState);

                // 开启写入文本
                pdfContent.beginText();
                // 设置字体
                pdfContent.setFontAndSize(baseFont, 20);

                // 在高度和宽度维度每隔waterMarkInterval距离添加一个水印
                for (int height = waterMarkHeight; height < pageRectangle.getHeight(); height = height + waterMarkInterval) {
                    for (int width = watermarkWeight; width < pageRectangle.getWidth() + watermarkWeight;
                         width = width + waterMarkInterval) {
                        // 添加水印文字并旋转30度角
                        pdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkContent, width - watermarkWeight,
                                height - waterMarkHeight, 30);
                    }
                }
                // 停止写入文本
                pdfContent.endText();
            }
            pdfStamper.close();
            pdfReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void mergePDF(String[] inputFilePathList, String outputFilePath){
        try {
            Document document = new Document();
            PdfCopy copy = new PdfCopy(document,new FileOutputStream(outputFilePath));
            document.open();
            for (String s : inputFilePathList){
                PdfReader pdfReader = new PdfReader(s);
                for (int i =1 ; i<=pdfReader.getNumberOfPages();i++){
                    copy.addPage(copy.getImportedPage(pdfReader,i));
                }
                pdfReader.close();
            }
            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

标签:String,int,合并,水印,pdfContent,加水,new,PDF
From: https://www.cnblogs.com/jingzihao/p/18051137

相关文章

  • PDF标准详解(二)——PDF 对象
    上一篇文章我们介绍了一个PDF文档应该包含的最基本的结构,并且手写了一个最简单的“HelloWorld”的PDF文档。后面我们介绍新的PDF标准给出示例时将以这个文档为基础,而不再给出完整的文档示例,小伙伴想自己测试可以根据上一节的文档来进行配置。对象上一节我们看到一个个奇奇怪......
  • Npoi操作Excel单元格合并
    publicasyncTask<byte[]>ExportNewReportByQuotationId(GuidquotationId){//stringsql=@$"select""Id""asModelId,(q.qq).keyaskey,(q.qq).valueasmyValuefrom(withaas(select""Id"&q......
  • git分支管理和合并
    1.git分支管理和合并1.1认识分支创建仓库之后,就有了一个默认的分支:master 如图所示:包含N个提交历史按照顺序排列有名字查看分支1.git菜单查看2.或者git图标查看 ......
  • 力扣88.合并两个有序数组
    题目:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m+n......
  • 【LeetCode】1768_交替合并字符串_C
    题目描述给你两个字符串word1和word2。请你从word1开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。返回合并后的字符串。示例示例1:输入:word1="abc",word2="pqr"输出:"apbqcr"解释:字符串合并情......
  • 56. 合并区间(中)
    目录题目法一、排序+讨论法二、简洁题目以数组intervals表示若干个区间的集合,其中单个区间为intervals[i]=[starti,endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例1:输入:intervals=[[1,3],[2,6],[8,10],[15,1......
  • netcore 将图片转为pdf上传
    privatestaticstringGetImageUrl(SaveWeldListInputmodel){varfileUrl=model.ProcedureFiles[0].File_Url;//获取文件扩展名stringextension=Path.GetExtension(fileUrl);stringfilePathDic="";......
  • [python]将多张图片合并为单个pdf文件
    前言最近有个个人需求是要把多个图片文件合并为一个PDF文件,这样方便用PDF阅读器连续看,避免界面点一下,只会图片放大。(比如看漫画)主要思路是先把单张图片转换成单个PDF文件,然后把PDF文件进行合并。原先是用WPS的转换工具做的,但WPS每次只能批量转换30张,如果有大量图片文件,用WPS就不......
  • Git 分支-查看&创建&切换&合并&合并冲突的解决
     gitbranch-v可以用来查看分支gitbranchxxx可以创建出xxx的分支名 gitcheckoutnew_branch1切换到new_branch1上来然后可以针对这个分支对文件进行修改和提交,如下所示 如果此时切换到master中来,发现文件又恢复到原始master的初始的样子,如下所示。所以修改......
  • 《哈利波特》1-7册全集高清PDF
    《哈利·波特》简介《哈利·波特》这个系列的图书自1997年在英国问世以来,迄今在全世界已发行超过四亿多册,创造了出版史上的奇迹,全套共7册,分别是:《HarryPotterandthePhilosopher’sStone哈利波特与魔法石》、《HarryPotterandtheChamberofSecrets哈利波特与密室》、......