最近在做关于PDF文档添加水印的功能,折腾了好久,终于好了。以下做个记录:

首先会用到iTextSharp组件,大家可以去官网下载,同时我也会在本文中附加进来。

  1. 代码中添加引用为:
 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using iTextSharp.text.pdf;
  6. using System.IO;
  7. using iTextSharp.text;
 
  1. 创建一个显示指定图片的pdf
  1. /// <summary>
  2. /// 创建一个显示指定图片的pdf
  3. /// </summary>
  4. /// <param name="picPdfPath"></param>
  5. /// <param name="picPath"></param>
  6. /// <returns></returns>
  7. public static bool CreatePDFByPic(string picPdfPath,string picPath)
  8. {
  9. //新建一个文档
  10. Document doc = new Document();
  11. try
  12. {
  13. //建立一个书写器(Writer)与document对象关联
  14. PdfWriter.GetInstance(doc, new FileStream(picPdfPath, FileMode.Create, FileAccess.ReadWrite));
  15. //打开一个文档
  16. doc.Open();
  17. //向文档中添加内容
  18. Image img = Image.GetInstance(picPath);
  19. //img.SetAbsolutePosition();
  20. doc.Add(img);
  21. return true;
  22. }
  23. catch (Exception ex)
  24. {
  25. return false;
  26. throw ex;
  27. }
  28. finally
  29. {
  30. if (doc != null)
  31. {
  32. doc.Close();
  33. }
  34. }
  35.  
  36. }
  1.  
  1.  PDF文档添加图片水印
  1. /// <summary>
  2. /// 加图片水印
  3. /// </summary>
  4. /// <param name="inputfilepath"></param>
  5. /// <param name="outputfilepath"></param>
  6. /// <param name="ModelPicName"></param>
  7. /// <param name="top"></param>
  8. /// <param name="left"></param>
  9. /// <returns></returns>
  10. public static bool PDFWatermark(string inputfilepath, string outputfilepath, string ModelPicName, float top, float left)
  11. {
  12. //throw new NotImplementedException();
  13. PdfReader pdfReader = null;
  14. PdfStamper pdfStamper = null;
  15. try
  16. {
  17. pdfReader = new PdfReader(inputfilepath);
  18.  
  19. int numberOfPages = pdfReader.NumberOfPages;
  20.  
  21. iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1);
  22.  
  23. float width = psize.Width;
  24.  
  25. float height = psize.Height;
  26.  
  27. pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.Create));
  28.  
  29. PdfContentByte waterMarkContent;
  30.  
  31. iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(ModelPicName);
  32.  
  33. image.GrayFill = 20;//透明度,灰色填充
  34. //image.Rotation//旋转
  35. //image.RotationDegrees//旋转角度
  36. //水印的位置
  37. if (left < 0)
  38. {
  39. left = width/2 - image.Width + left;
  40. }
  41.  
  42. //image.SetAbsolutePosition(left, (height - image.Height) - top);
  43. image.SetAbsolutePosition(left, (height/2 - image.Height) - top);
  44.  
  45. //每一页加水印,也可以设置某一页加水印
  46. for (int i = 1; i <= numberOfPages; i++)
  47. {
  48. //waterMarkContent = pdfStamper.GetUnderContent(i);//内容下层加水印
  49. waterMarkContent = pdfStamper.GetOverContent(i);//内容上层加水印
  50.  
  51. waterMarkContent.AddImage(image);
  52. }
  53. //strMsg = "success";
  54. return true;
  55. }
  56. catch (Exception ex)
  57. {
  58. throw ex;
  59.  
  60. }
  61. finally
  62. {
  63.  
  64. if (pdfStamper != null)
  65. pdfStamper.Close();
  66.  
  67. if (pdfReader != null)
  68. pdfReader.Close();
  69. }
  70. }
  1.  
 添加普通偏转角度文字水印
 
  1. /// <summary>
  2. /// 添加普通偏转角度文字水印
  3. /// </summary>
  4. /// <param name="inputfilepath"></param>
  5. /// <param name="outputfilepath"></param>
  6. /// <param name="waterMarkName"></param>
  7. /// <param name="permission"></param>
  8. public static void setWatermark(string inputfilepath, string outputfilepath,string waterMarkName)
  9. {
  10. PdfReader pdfReader = null;
  11. PdfStamper pdfStamper = null;
  12. try
  13. {
  14. pdfReader = new PdfReader(inputfilepath);
  15. pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.Create));
  16. int total = pdfReader.NumberOfPages + 1;
  17. iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1);
  18. float width = psize.Width;
  19. float height = psize.Height;
  20. PdfContentByte content;
  21. BaseFont font = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
  22. PdfGState gs = new PdfGState();
  23. for (int i = 1; i < total; i++)
  24. {
  25. content = pdfStamper.GetOverContent(i);//在内容上方加水印
  26. //content = pdfStamper.GetUnderContent(i);//在内容下方加水印
  27. //透明度
  28. gs.FillOpacity = 0.3f;
  29. content.SetGState(gs);
  30. //content.SetGrayFill(0.3f);
  31. //开始写入文本
  32. content.BeginText();
  33. content.SetColorFill(BaseColor.LIGHT_GRAY);
  34. content.SetFontAndSize(font, 100);
  35. content.SetTextMatrix(0, 0);
  36. content.ShowTextAligned(Element.ALIGN_CENTER, waterMarkName, width / 2 - 50,height / 2 - 50, 55);
  37. //content.SetColorFill(BaseColor.BLACK);
  38. //content.SetFontAndSize(font, 8);
  39. //content.ShowTextAligned(Element.ALIGN_CENTER, waterMarkName, 0, 0, 0);
  40. content.EndText();
  41. }
  42. }catch (Exception ex)
  43. {
  44. throw ex;
  45. }
  46. finally
  47. {
  48.  
  49. if (pdfStamper != null)
  50. pdfStamper.Close();
  51.  
  52. if (pdfReader != null)
  53. pdfReader.Close();
  54. }
  55. }

添加倾斜水印

  1. /// <summary>
  2. /// 添加倾斜水印
  3. /// </summary>
  4. /// <param name="inputfilepath"></param>
  5. /// <param name="outputfilepath"></param>
  6. /// <param name="waterMarkName"></param>
  7. /// <param name="userPassWord"></param>
  8. /// <param name="ownerPassWord"></param>
  9. /// <param name="permission"></param>
  10. public static void setWatermark(string inputfilepath, string outputfilepath, string waterMarkName, string userPassWord, string ownerPassWord, int permission)
  11. {
  12. PdfReader pdfReader = null;
  13. PdfStamper pdfStamper = null;
  14. try
  15. {
  16. pdfReader = new PdfReader(inputfilepath);
  17. pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.Create));
  18. // 设置密码
  19. //pdfStamper.SetEncryption(false,userPassWord, ownerPassWord, permission);
  20.  
  21. int total = pdfReader.NumberOfPages + 1;
  22. PdfContentByte content;
  23. BaseFont font = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\SIMFANG.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
  24. PdfGState gs = new PdfGState();
  25. gs.FillOpacity = 0.2f;//透明度
  26.  
  27. int j = waterMarkName.Length;
  28. char c;
  29. int rise = 0;
  30. for (int i = 1; i < total; i++)
  31. {
  32. rise = 500;
  33. content = pdfStamper.GetOverContent(i);//在内容上方加水印
  34. //content = pdfStamper.GetUnderContent(i);//在内容下方加水印
  35.  
  36. content.BeginText();
  37. content.SetColorFill(BaseColor.DARK_GRAY);
  38. content.SetFontAndSize(font, 50);
  39. // 设置水印文字字体倾斜 开始
  40. if (j >= 15)
  41. {
  42. content.SetTextMatrix(200, 120);
  43. for (int k = 0; k < j; k++)
  44. {
  45. content.SetTextRise(rise);
  46. c = waterMarkName[k];
  47. content.ShowText(c + "");
  48. rise -= 20;
  49. }
  50. }
  51. else
  52. {
  53. content.SetTextMatrix(180, 100);
  54. for (int k = 0; k < j; k++)
  55. {
  56. content.SetTextRise(rise);
  57. c = waterMarkName[k];
  58. content.ShowText(c + "");
  59. rise -= 18;
  60. }
  61. }
  62. // 字体设置结束
  63. content.EndText();
  64. // 画一个圆
  65. //content.Ellipse(250, 450, 350, 550);
  66. //content.SetLineWidth(1f);
  67. //content.Stroke();
  68. }
  69.  
  70. }
  71. catch (Exception ex)
  72. {
  73. throw ex;
  74. }
  75. finally
  76. {
  77.  
  78. if (pdfStamper != null)
  79. pdfStamper.Close();
  80.  
  81. if (pdfReader != null)
  82. pdfReader.Close();
  83. }
  84. }
 调用方法的例子:
 
  1. string path = "D://my.pdf";
  2. HtmlToPDFUtil.HtmlToPdf(Request.Url.AbsoluteUri, path);
  3. //HtmlToPDFUtil.HtmlToPdf(sbUrlList.ToString(), path);
  4. PDFSetWaterMark.PDFWatermark(path, "D://my.pdf", Server.MapPath("/HtmlToPdf/Tools/sy.bmp"), 0, 0);
  5. PDFSetWaterMark.setWatermark("D://my.pdf", "D://my2.pdf", "TEST");
  6. //PDFSetWaterMark.setWatermark("D://my.pdf", "D://my2.pdf", "TEST", "", "", 1);

附件:iTextSharp

  1.  

利用iTextSharp组件给PDF文档添加图片水印,文字水印的更多相关文章

  1. Java 如何给Word文档添加多行文字水印

    前言 我在以往的文章中曾介绍过如何给Word文档添加文本水印和图片水印,及怎样删除文档中的水印.关于文本水印,之前那篇教程里主要指的是单行字体的水印,而在操作Word文档时,有时也会碰到需要添加多行文 ...

  2. C#如何给PDF文档添加注释

    整理文档时,我们可能会需要在一些或一段文字上添加注释加以说明,那如何以编程的方式实现呢?本文将实例讲述C#中如何使用免费组件给PDF文档添加文本注释,包括自由文本注释.自由文本注释能允许我们自定义它的 ...

  3. C#给PDF文档添加文本和图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  4. 利用Java动态生成 PDF 文档

    利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...

  5. C# 给现有PDF文档添加页眉、页脚

    概述 页眉页脚是一篇完整.精致的文档的重要组成部分.在页眉页脚处,可以呈现的内容很多,如公司名称.页码.工作表名.日期.图片,如LOGO.标记等.在之前的文章中介绍了如何通过新建一页空白PDF页来添加 ...

  6. 如何给PDF文档添加和删除贝茨编号

    PDF文件的使用频率高了,我们也不只局限于使用PDF文件了,也会需要编辑PDF文件的时候,那么如何在PDF文件中添加和去除贝茨编号呢,应该有很多小伙伴都想知道吧,今天就来跟大家分享一下吧,小伙伴们就一 ...

  7. ABBYY FineReader 15 如何为PDF文档添加页眉页脚

    页眉.页脚是文档页面顶部或底部重复出现的文本信息.很多用户会习惯在文档页面的顶部与底部区域添加页眉.页脚来展现页码.文档标题.作者姓名.品牌名称等附加信息.而ABBYY FineReader 15(W ...

  8. PDF文档转换为图片、图片转成PDF 及PDF合并

    简介 功能:PDF文档按每页转换成一张图片,一张图片转换成一张PDF 并将多张PDF合成一个多页的PDF文档. 经历:在各个网站上搜索始终出现各种问题,尤其是遇到引用的版本问题尤其头疼,不是不能适用当 ...

  9. icepdf和pdfbox转pdf文档为图片

    icepdf转pdf文档为图片 首先导入icepdf jar包或maven pdfPath为pdf文件路径.pdfimgpsth为图片保存的路径 public static void icePdfIm ...

随机推荐

  1. 算法题:给你一个自然数N,求[6, N]之内的全部素数中, 两两之和为偶数的那些偶数。

    /* 算法题:给你一个自然数N,求[6, N]之内的全部素数中. 两两之和为偶数的那些偶数. */ #include <iostream> using namespace std; voi ...

  2. vue -- 跨域cookie 丢失的问题

    前端使用了vue-reource的$http进行请求后台接口 登陆完成后,服务端监控发现无法拿到cookie,下面看几张前端控制台监控的图 reqqust Header  没有显示cookie 信息 ...

  3. 洛谷P3531 [POI2012]LIT-Letters

    题目描述 Little Johnny has a very long surname. Yet he is not the only such person in his milieu. As it ...

  4. Kinect 开发 —— 手势识别(下)

    基本手势追踪 手部追踪在技术上和手势识别不同,但是它和手势识别中用到的一些基本方法是一样的.在开发一个具体的手势控件之前,我们先建立一个可重用的追踪手部运动的类库以方便我们后续开发.这个手部追踪类库包 ...

  5. Oracle新建表字段,如何使字段自增

    oracle的自增需要依靠序列和触发器共同实现 比如 新建一张表 create table test (id int primary key, name varchar2(10));   创建一个序列 ...

  6. Python day3 知识回顾

    names = ["Jonathen","Joesph","Jotaro","Josuke",["Mea&qu ...

  7. Linux搭建aspx.net环境之:CentOs 7 安装 Mono 和 Jexus 步骤记录

    1 因为163没有CentOs7的镜像.所以没有加这个 wget  http://mirrors.163.com/.help/CentOS6-Base-163.repo cd /etc/yum.rep ...

  8. js中对数组的操作-------Day49

    今天碰到了一个问题:easyui的使用中,datagrid表格的高度怎样改变(设定成一个固定的高度),看了半天文档,也从网上查了些.还楞是没弄出来,有点小郁闷.这easyui在某些情况情况下确实好用了 ...

  9. Linux网络编程--字节序

    1 .谈到字节序,那么会有朋友问什么是字节序 非常easy:[比如一个16位的整数.由2个字节组成,8位为一字节,有的系统会将高字节放在内存低的地址上,有的则将低字节放在内存高的地址上,所以存在字节序 ...

  10. php excel文件导出之phpExcel扩展库

    php Excel  文件导出 phpExcel 官网 http://phpexcel.codeplex.com/ /** * 导出特定文件 * 依据详细情况而定 */ public function ...