最近公司给了一个research的任务[PDF IRM,相关的具体信息如下http://forums.adobe.com/message/3281099]:我们可以给一个PDF[acrobat reader]文档设置密码,不允许打印/复制,现在需要一份文档的有效时间[如在2011年4月5号之前,一个文档需要密码才能打开,过了这个时间后,该文档就不会有任何限制,离线时这个时间段设置仍然有效]。
主要从以下几个方面入手考虑了下:
1)office的IRM机制
这些功能是windows 系统的office软件集成好了的功能,其IRM[information right management]是由一个RMS(自vista后的Windows系统都自动安装了这个com组件)组件来实现权限保护的,工作流程如下图:
[如上图所示,一般情况下,客户端计算机必须连接到内部网络中才可以获得受RM保护内容的发布许可。如果在客户端计算机未连接到内部网络的情况下使用这些计算机发布受RM保护的内容,则需要进行客户端注册,使用许可证书在未连接到内部网络的情况下发布受RM保护的内容。文档的作者可以使用RMS客户端应用程序(比如Office 2003)来设置与企业的业务策略相一致的内容使用权限和条件。接收了RM保护内容的每个用户均可以通过Windows RMS请求和接收用户许可证,其中列出了该用户使用该内容时的使用权限和条件。RMS客户端应用程序(如Office 2003)可以使用Windows RM技术来读取、解释和实施使用权限和条件。支持RM的应用程序使用对称密钥加密内容,所有Windows RMS服务器、客户端计算机和用户账户都具有相关联的1024位的RSA密钥]
,类似的,我这家公司主要做UC[U-content,内容管理]和DM[document management]文档管理,故对文档的安全级别要求比较高,于是也想实现一个PDF的离线文档安全设置,下面是
2)EMC公司关于 PDF IRM的一些原理,Adobe公司本身提供的产品是Adobe livecycle management system:
也需要安装一个IRM server之类的东西,现在的问题是公司不想买这些东西,想通过一些其他手段来实现这个功能,断断续续的着手这个东西也很长时间了,还是没有找到一个比较好的解决方案,下面是整理的一些研究成果:
11)通过itextSharp,结合C#可以创建一个PDF文档,并为其设置访问密码,是否可以复制/打印,设置水印等,在网上搜的结合一些代码如下:
1 using System;
3 using System.Linq;
4 using System.Web;
5 using System.Web.UI;
6 using System.Web.UI.WebControls;
7
8
9 using iTextSharp.text;
10 using iTextSharp.text.pdf;
11
12 using System.IO;
13 using System.Diagnostics;
14
15 /// <summary>
16 /// 生成复杂的PDF,权限信息 ,水印 加密
17 /// </summary>
18 private void CreatComplexPDF()
19 {
20
21 //定义一个Document,并设置页面大小为A4,竖向
22 iTextSharp.text.Document doc = new Document(PageSize.A4);
23 try
24 {
25 //写实例
26 PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream("watermark.pdf", FileMode.Create));
27
28 #region
29 // 载入字体,iTextAsian.dll,可以到codeproject或sourceforge上下载到
30 BaseFont.AddToResourceSearch(@"E:\vs2010\Demo\2010Demo\WebSite\Bin\iTextAsian.dll");
31 BaseFont.AddToResourceSearch(@"E:\vs2010\Demo\2010Demo\WebSite\Bin\iTextAsianCmaps.dll");
32 BaseFont bf = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
33
34 #endregion
35
36 //设置PDF文件加密 复制 打印
37 int intAllowCopy = this.ckbAllowCopy.Checked ? PdfWriter.ALLOW_COPY : 0;
38 int intAllowPrint = this.ckbAllowPrint.Checked ? PdfWriter.ALLOW_PRINTING : 0;
39 writer.SetEncryption(true, this.txtPassword.Text.Trim(), this.txtPassword.Text.Trim(), intAllowCopy | intAllowPrint|PdfWriter.HideMenubar|PdfWriter.HideToolbar);
40
41 //writer.AddJavaScript
42 //PdfAction jAction =PdfAction.JavaScript("app.alert('test')", writer);
43 //writer.AddJavaScript(jAction);
44 // writer.AddJavaScript("docOpened",
45 // @"function docOpened() {
46 //app.alert('今天是'"+DateTime.Now.ToShortDateString()+",文档将在"+DateTime.Parse(this.txtDate.Text).ToShortDateString()+"后过期!}\n");
47 //生成水印
48 writer.PageEvent = new PdfEventHanler(this.txtWatermark.Text, bf);
49
50
51 #region 设置PDF的一些文件信息
52 doc.AddAuthor("Lucio");
53 doc.AddCreationDate();
54 doc.AddCreator("Lucio");
55 doc.AddSubject("使用C#生成水印加密的PDF文件");
56 doc.AddTitle("This is created by lucio for testing");
57 doc.AddKeywords("C#,PDF,Encryption,WaterMark");
58 doc.AddHeader("Lucio", "Lucio");
59
60 #endregion
61 //打开document
62 doc.Open();
63
64 //写入一个段落, Paragraph
65 doc.Add(new Paragraph(this.txtPdfContent.Text, new Font(bf, 12)));
66
67 //关闭document
68 doc.Close();
69 //打开PDF,看效果
70 Process.Start("watermark.pdf");
71 }
72 catch (DocumentException de)
73 {
74 Console.WriteLine(de.Message);
75 Console.ReadKey();
76 }
77 catch (IOException io)
78 {
79 Console.WriteLine(io.Message);
80 Console.ReadKey();
81 }
82 }
83
84
85
86 #region
87 //生成水印类
88 public class PdfEventHanler : PdfPageEventHelper
89 {
90 string m_WatermaskText;
91 BaseFont m_WatermaskTextFont;
92
93 /// <summary>
94 ///
95 /// </summary>
96 /// <param name="watermaskText">水印文字的内容</param>
97 /// <param name="watermaskTextFont">水印文字的字体</param>
98 public PdfEventHanler(string watermaskText, BaseFont watermaskTextFont)
99 {
100 m_WatermaskText = watermaskText;
101 m_WatermaskTextFont = watermaskTextFont;
102 }
103
104 /// <summary>
105 /// 在Page End事件中,添加页面水印,此事件在每页均会发生
106 /// </summary>
107 /// <param name="writer"></param>
108 /// <param name="document"></param>
109 public override void OnEndPage(PdfWriter writer, Document document)
110 {
111 PdfGState gstate = new PdfGState();
112 gstate.FillOpacity = 0.2f; //设置灰度和透明度
113 gstate.StrokeOpacity = 0.2f;
114
115 //水印内容,必须放置在底层
116 PdfContentByte wm = writer.DirectContentUnder;
117 wm.SaveState();
118 wm.SetGState(gstate);
119
120 #region 给页面添加文字水印
121 wm.SetFontAndSize(m_WatermaskTextFont, 50);
122 wm.BeginText();
123 wm.ShowTextAligned(Element.ALIGN_CENTER, m_WatermaskText, document.PageSize.Width / 2, document.PageSize.Height / 2, -35f);
124 wm.EndText();
125 #endregion
126
127 wm.RestoreState();
128
129 base.OnEndPage(writer, document);
130 }
131 }
132
133
134 #endregion
22)研究acroJs,acrobat javascript能做的事情:
创建PDF
可以做一个假的效果出来,但是始终无法处理移除掉原来的权限设置...,附录:下面是一些网上搜集的资料,留个备份:
//adobe官网提问如下