java实现给pdf文件添加水印效果

需求:给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>

2、代码实现

//处理pdf文件
    public void loadPdf(HttpServletRequest request,HttpServletResponse response, String strUrl) throws Exception {
        URL url = new URL(strUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //得到输入流
        InputStream inputStream = conn.getInputStream();
        String[] urlSplit = strUrl.split("/");
        int i = urlSplit.length;
        String[] nextSplit = urlSplit[i - 1].split("\\.");
        //解析出名字
        String fileName = nextSplit[0];
        //来使得唯一
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
        String str = sdf.format(System.currentTimeMillis());

        for (int m = 1; m < 3; m++) {

            int rd = (int) (Math.random() * 10);
            str = str + rd;
        }

        //保存路径
        String filePath = "D:\\" + fileName + "-" + str + ".pdf";
        File file = new File(filePath);
        // 将输入流转为文件
        FileUtils.copyInputStreamToFile(inputStream, file);

        //获取当前登陆用户
        User user = ToolsUtil.getUser();
        String outputFilePath = "D:\\b.pdf";
        // 给获取到的pdf添加水印
        waterMark(filePath, outputFilePath, user.getName());
        // 下载pdf
        downPdf(request,response, outputFilePath);
    }

    //给PDF添加水印
    //inputFile 文件路径+名称
    //outputFile 添加水印后输出文件保存的路径+名称
    //waterMarkName 添加水印的内容
    public static void waterMark(String inputFile,String outputFile, String waterMarkName) {
        try {
            //切记这里的参数是文件的路径 ,路径必须是双斜杠的如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;
			// 仅添加一个水印
            for (int i = 1; i < total; i++) {
                under = stamper.getOverContent(i);// 在内容上方加水印
                //under = stamper.getUnderContent(i);//在内容下方加水印
                gs.setFillOpacity(0.2f);
                under.setGState(gs);
                under.beginText();
                under.setColorFill(BaseColor.LIGHT_GRAY);//改变颜色
                under.setFontAndSize(base, 200);//改水印文字大小
                under.setTextMatrix(70, 200);
                //后3个参数,x坐标,y坐标,角度
                under.showTextAligned(Element.ALIGN_CENTER, waterMarkName, 300, 350, 55);

                under.endText();
            }
            //下边这一段可添加多个水印
//            Rectangle pageRect = null;
//            FontMetrics metrics;
//            int interval = -5;
//            int textH = 0;
//            int textW = 0;
//            label.setText(waterMarkName);
//            metrics = label.getFontMetrics(label.getFont());
//            textH = metrics.getHeight();
//            textW = metrics.stringWidth(label.getText());
//            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 void downPdf(HttpServletRequest httprequest,HttpServletResponse response, String fileName) throws IOException{


        String filename = "test.pdf";
        File file = new File(fileName);
        //  文件存在才下载
        if (file.exists()) {
            OutputStream out = null;
            FileInputStream in = null;
            try {
                // 读取要下载的内容
                in = new FileInputStream(file);

                // 告诉浏览器下载的方式以及一些设置
                // 解决文件名乱码问题,获取浏览器类型,转换对应文件名编码格式,IE要求文件名必须是utf-8, firefo要求是iso-8859-1编码
                String agent = httprequest.getHeader("user-agent");
                if (agent.contains("FireFox")) {
                    filename = new String(filename.getBytes("UTF-8"), "iso-8859-1");
                } else {
                    filename = URLEncoder.encode(filename, "UTF-8");
                }
                // 设置下载文件的mineType,告诉浏览器下载文件类型
                String mineType = httprequest.getServletContext().getMimeType(filename);
                response.setContentType(mineType);
                // 设置一个响应头,无论是否被浏览器解析,都下载
                response.setHeader("Content-disposition", "attachment; filename=" + filename);
                // 将要下载的文件内容通过输出流写到浏览器
                out = response.getOutputStream();
                int len = 0;
                byte[] buffer = new byte[1024];
                while ((len = in.read(buffer)) > 0) {
                    out.write(buffer, 0, len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            }
        }
    }

转自:https://blog.csdn.net/weixin_43776989/article/details/108826486

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用 Java 语言实现PDF 文件水印的代码: ```java import com.itextpdf.kernel.color.Color; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.property.TextAlignment; import java.io.File; import java.io.IOException; public class PdfWatermark { public static void main(String[] args) throws IOException { String srcFile = "document.pdf"; // 原始 PDF 文件 String destFile = "document_with_watermark.pdf"; // 加水印后的 PDF 文件 String watermark = "Confidential"; // 要添加水印文本 addWatermark(srcFile, destFile, watermark); // 调用添加水印的方法 } public static void addWatermark(String srcFile, String destFile, String watermark) throws IOException { PdfDocument pdfDoc = new PdfDocument(new PdfReader(srcFile), new PdfWriter(destFile)); Document doc = new Document(pdfDoc); for (int pageNum = 1; pageNum <= pdfDoc.getNumberOfPages(); pageNum++) { PdfPage page = pdfDoc.getPage(pageNum); Rectangle pageSize = page.getPageSize(); PdfCanvas canvas = new PdfCanvas(page); canvas.beginText(); canvas.setFontAndSize(null, 50); canvas.setColor(Color.GRAY, true); canvas.setTextMatrix(pageSize.getWidth() / 2, pageSize.getHeight() / 2); canvas.showTextAligned(new Paragraph(watermark).setBold().setFontColor(Color.GRAY).setTextAlignment(TextAlignment.CENTER), pageSize.getWidth() / 2, pageSize.getHeight() / 2, pageNum, TextAlignment.CENTER, com.itextpdf.kernel.geom.VerticalAlignment.MIDDLE, 45); canvas.endText(); } doc.close(); System.out.println("水印添加成功!"); } } ``` 以上代码中,我们使用了 iText 库来操作 PDF 文件。在添加水印时,我们首先打开原始 PDF 文件,并创建一个 Document 对象。然后,我们遍历 PDF 文件中的所有页面,为每个页面添加水印。为了添加水印,我们使用了 PdfCanvas 类,它提供了一组方法来绘制文本、图形等。在我们的例子中,我们使用 beginText() 方法开始绘制文本,setFontAndSize() 方法设置字体和字号,setColor() 方法设置颜色,setTextMatrix() 方法设置文本的位置,showTextAligned() 方法绘制文本,并使用 endText() 方法结束绘制。最后,我们使用 Document 对象的 close() 方法关闭 PDF 文件,并输出一条水印添加成功的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值