背景

团队手里在做的一个项目,其中一个小功能是用户需要上传PDF文件到文件服务器上,都是一些合同或者技术评估文档,鉴于知识版权和防伪的目的,需要在上传的PDF文件打上水印,

这时候我们需要提供能力给客户,让他们可以对自己上传的文档,配置文字或者图片水印。

实现

于是我们参考了网上的一些资料,首选Spire.Pdf 和 iTextSharp,资料很多,是专业的PDF操作组件。

Spire.Pdf

Spire Nuget安装

直接安装最新的版本就可以了

Spire 代码段

这是生成图片水印,注释很清晰了。

 1  #region Spire.Pdf 组件
2
3 //创建PdfDocument对象
4 PdfDocument pdf = new PdfDocument();
5 //加载现有PDF文档
6 pdf.LoadFromFile(@"E:\WaterMark\ATAM.pdf");
7 //加载图片到System.Drawing.Image对象
8 System.Drawing.Image image = System.Drawing.Image.FromFile(@"E:\WaterMark\logo.png");
9 //遍历文档每一页(可以指定只是轮询某一个页面)
10 foreach (PdfPageBase page in pdf.Pages)
11 {
12 //设置背景图
13 page.BackgroundImage = image;
14 //设置背景图的位置及大小(这边根据我们实际的图片大小进行同比缩小)
15 page.BackgroundRegion = new RectangleF((page.ActualSize.Width - 500) / 2,
16 (page.ActualSize.Height - 500)/2, 500, 250);
17 //设置背景透明度
18 page.BackgroudOpacity = 0.5f;
19 }
20 //保存并关闭文档(不关闭貌似打开的时候会有异常)
21 pdf.SaveToFile(@"E:\WaterMark\ATAM_WaterMark.pdf");
22 pdf.Close();
23
24 #endregion

Spire 实现结果

看着还行,起码达到效果了

Spire 扩展:文字水印

 1 //加载PDF文档
2 PdfDocument pdf = new PdfDocument();
3 pdf.LoadFromFile(@"E:\WaterMark\ATAM.pdf");
4
5 //获取PDF文档的第一页
6 PdfPageBase page = pdf.Pages[0];
7
8 //绘制文本,设置文本格式并将其添加到页面
9 PdfTilingBrush brush = new PdfTilingBrush(new SizeF(page.Canvas.ClientSize.Width / 2, page.Canvas.ClientSize.Height / 3));
10 brush.Graphics.SetTransparency(0.3f);
11 brush.Graphics.Save();
12 brush.Graphics.TranslateTransform(brush.Size.Width / 2, brush.Size.Height / 2);
13 brush.Graphics.RotateTransform(-45);
14 PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial Unicode MS", 20f), true);
15 brush.Graphics.DrawString("这边定制你的文字水印", font, PdfBrushes.Red, 0, 0, new PdfStringFormat(PdfTextAlignment.Center));
16 brush.Graphics.Restore();
17 brush.Graphics.SetTransparency(1);
18 page.Canvas.DrawRectangle(brush, new RectangleF(new PointF(0, 0), page.Canvas.ClientSize));
19
20 //保存文档
21 pdf.SaveToFile(@"E:\WaterMark\ATAM_WaterMark.pdf");
22 pdf.Close();

iTextSharp

iTextSharp Nuget安装

一样,直接安装最新版本即可

iTextSharp 代码段

这是iTextSharp 生成图片水印的方法代码,注释一样很清晰。

 1         /// <summary>
2 /// 打水印功能
3 /// </summary>
4 /// <param name="infilepath">输入文件地址</param>
5 /// <param name="outfilepath">输出文件地址</param>
6 /// <param name="picName">图片文件地址</param>
7 /// <param name="picHeight">图片高度(可选)</param>
8 /// <param name="picWidth">图片宽度(可选)</param>
9 /// <param name="top">图片在PDF中的位置Top(可选)</param>
10 /// <param name="left">图片在PDF中的位置Left(可选)</param>
11 /// <returns></returns>
12 public bool PDFWatermark(string infilepath, string outfilepath, string picName,float picHeight=0,float picWidth=0,float top = 0,float left=0)
13 {
14 PdfReader pdfReader = null;
15 PdfStamper pdfStamper = null;
16 try
17 {
18 pdfReader = new PdfReader(infilepath);
19 int numberOfPages = pdfReader.NumberOfPages;
20 iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1);
21 float width = psize.Width;
22 float height = psize.Height;
23 pdfStamper = new PdfStamper(pdfReader, new FileStream(outfilepath, FileMode.Create));
24 PdfContentByte waterMarkContent;
25 iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(picName);
26 if (picHeight != 0) image.ScaleAbsoluteHeight(picHeight);
27 else picHeight = image.Height;
28 if (picWidth != 0) image.ScaleAbsoluteWidth(picWidth);
29 else picWidth = image.Width;
30 image.GrayFill = 20; // 透明度,灰色填充
31 // image.Rotation // 旋转
32 // image.RotationDegrees // 旋转角度
33 // 水印的位置
34 if (left == 0) left = (width - picWidth) / 2;
35 if (top == 0) top = (height - picHeight) / 2;
36 image.SetAbsolutePosition(left,top);
37 // 每一页加水印,也可以设置某一页加水印
38 for (int i = 1; i <= numberOfPages; i++)
39 {
40 waterMarkContent = pdfStamper.GetUnderContent(i);//水印在最底层
41 //这边注意,如果想要水印在最顶层,这边改成 pdfStamper.GetOverContent
42 waterMarkContent.AddImage(image);
43 }
44 return true;
45 }
46 catch (Exception ex)
47 {
48 ex.Message.Trim();
49 return false;
50 }
51 finally
52 {
53
54 if (pdfStamper != null) pdfStamper.Close();
55 if (pdfReader != null) pdfReader.Close();
56 }
57 }

应用

1   #region iTextSharp
2 string source = @"E:\WaterMark\ATAM.pdf"; //模板路径
3 string output = @"E:\WaterMark\ATAM_WaterMark.pdf"; //导出水印背景后的PDF
4 string watermark = @"E:\WaterMark\logo.png"; // 水印图片
5 bool isSurrcess = PDFWatermark(source, output, watermark,250,500,0,0);
6 #endregion

iTextSharp 实现结果

也不错,这个貌似实现起来更加灵活。

iTextSharp 扩展:文字水印

 1    /// <summary>
2 /// 添加文字水印
3 /// </summary>
4 /// <param name="filePath">pdf文件地址</param>
5 /// <param name="text">水印文本</param>
6 public static void SetWatermark(string filePath, string text)
7 {
8 PdfReader pdfReader = null;
9 PdfStamper pdfStamper = null;
10 string tempPath = Path.GetDirectoryName(filePath) + Path.GetFileNameWithoutExtension(filePath) + "_temp.pdf";
11 try
12 {
13 pdfReader = new PdfReader(filePath);
14 pdfStamper = new PdfStamper(pdfReader, new FileStream(tempPath, FileMode.Create));
15 int total = pdfReader.NumberOfPages + 1;
16 iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1);
17 float width = psize.Width;
18 float height = psize.Height;
19 PdfContentByte content;
20 BaseFont font = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
21 PdfGState gs = new PdfGState();
22 for (int i = 1; i < total; i++)
23 {
24 //在内容上方加水印(下方加水印参考上面图片代码做法)
25 content = pdfStamper.GetOverContent(i);
26 //透明度
27 gs.FillOpacity = 0.3f;
28 content.SetGState(gs);
29 //写入文本
30 content.BeginText();
31 content.SetColorFill(BaseColor.GRAY);
32 content.SetFontAndSize(font, 30);
33 content.SetTextMatrix(0, 0);
34 content.ShowTextAligned(Element.ALIGN_CENTER, text, width - 120, height - 120, -45);
35 content.EndText();
36 }
37 }
38 catch (Exception ex)
39 {
40 throw ex;
41 }
42 finally
43 {
44 if (pdfStamper != null)pdfStamper.Close();
45 if (pdfReader != null)pdfReader.Close();
46 File.Copy(tempPath, filePath, true);
47 File.Delete(tempPath);//删除临时文件
48 }
49 }

参考资料

Spire.Pdf:https://www.cnblogs.com/Yesi/p/4913603.html

iTextSharp:https://www.cnblogs.com/xishuqingchun/p/3838185.html

后记

代码都是片段,没有进一步优化封装,主要是为了验证可行性。两个组件都好用,可以去官网看看文档,有很多功能提供使用。

开发笔记:PDF生成文字和图片水印的更多相关文章

  1. 利用iTextSharp组件给PDF文档添加图片水印,文字水印

    最近在做关于PDF文档添加水印的功能,折腾了好久,终于好了.以下做个记录: 首先会用到iTextSharp组件,大家可以去官网下载,同时我也会在本文中附加进来. 代码中添加引用为:   using S ...

  2. ASP.NET(C#)图片加文字、图片水印,神啊,看看吧

    ASP.NET(C#)图片加文字.图片水印 一.图片上加文字: //using System.Drawing; //using System.IO; //using System.Drawing.Im ...

  3. Java在已存在的pdf文件中生成文字和图片--基础

    自我总结,有什么不足之处请告知,感激不尽!下一次总结pdf模板映射生成报表(应对多变的pdf报表需求,数据提供和报表生成解耦). 目的:在给定的pdf模板上生成报表,就需要知道最基本的操作:文字添加, ...

  4. PHP加水印代码 支持文字和图片水印

    PHP加图片水印.文字水印类代码,PHP加水印类,支持文字图片水印的透明度设置.水印图片背景透明.自己写的一个类,因为自己开发的一套CMS中要用到,网上的总感觉用着不顺手,希望大家也喜欢这个类,后附有 ...

  5. PHP 文字,图片水印,缩略图,裁切成小图(大小变小)

    文字水印基本思路:1.用getimagesize()获取图片的信息(as:大小,属性等):2.根据图片信息用imagecreatefromjpeg ()/imagecreatefromgif/imag ...

  6. Java 在PDF中添加水印——文本/图片水印

    水印是一种十分常用的防伪手段,常用于各种文档.资料等.常见的水印,包括文字类型的水印.图片或logo类型的水印.以下Java示例,将分别使用insertTextWatermark(PdfPageBas ...

  7. C# 给图片添加透明的文字、图片水印

    #region 添加水印 /// <summary> /// 添加文字水印 /// </summary> /// <param name="image" ...

  8. vue中添加文字或图片水印

    首先引用warterMark.js,内容如下 'use strict' var watermark = (className,str,type) => { let dom = document. ...

  9. c# iText 生成PDF 有文字,图片,表格,文字样式,对齐方式,页眉页脚,等等等,

    #region 下载说明书PDF protected void lbtnDownPDF_Click(object sender, EventArgs e) { int pid = ConvertHel ...

随机推荐

  1. hystrix源码之线程池

    HystrixThreadPool 定义了hystrix线程池接口 获取ExecutorService对象,即jdk定义的线程池. public ExecutorService getExecutor ...

  2. 说说我对 WSGI 的理解

    先说下 WSGI 的表面意思,Web Server Gateway Interface 的缩写,即 Web 服务器网关接口. 之前不知道 WSGI 意思的伙伴,看了上面的解释后,我估计也还是不清楚,所 ...

  3. Python+Appium实现APP自动化测试

    一.环境准备 1.脚本语言:Python3.x IDE:安装Pycharm 2.安装Java JDK .Android SDK 3.adb环境,path添加E:\Software\Android_SD ...

  4. python常用os模块

    OS 模块 #os模块就是对操作系统进行操作,使用该模块必须先导入模块: import os #getcwd() 获取当前工作目录(当前工作目录默认都是当前文件所在的文件夹) result = os. ...

  5. 你可能不知道的 Date 类

    Date 是 JS 中的重要的一个内置对象,其实例主要用于处理时间和日期,其时间基于 1970-1-1 (世界标准时间)起的毫秒数,时间戳长度为 13 位(不同于 Unix 时间戳的长度 10 位). ...

  6. ViewBinding的简单使用

    Android自家的,又可以省去findviewbyid(),而且Butterknife上大神都已经推荐使用的,还有什么理由不去改写呢 build.gradle 开启viewBinding功能 and ...

  7. Centos-链接-ln

    ln 用来在文件或者目录之间创建链接,分为软链接和硬链接,硬链接依据文件的inode来进行链接,linux系统中允许存在多个inode号,文件真正的删除,是指向这个文件block的inode为0则该数 ...

  8. Ajax接收int类型乱码

    在Ajax返回值类型是 "text" 的时候,接收int类型时可能会出现ၧ 解决方法:将int转为String即可 int money =100; String s = Integ ...

  9. Layman 使用ffmpeg-php扩展库实现视频截图(默认图)

    这几天做项目,其中一个需求是用户上传视频文件到服务器,然后服务器自动截取该视频的一帧作为该视频对应的缩略图,服务器端语言采用php编写,找了半天资料,发现ffmpeg-php可以满足该需求,所以下面简 ...

  10. 039 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 01 循环结构概述

    039 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 01 循环结构概述 本文知识点:循环结构概述 循环结构主要内容 while 循环 do-whiile ...