心灵的沉淀......

记录点滴心路历程,不断成长
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

PDF IRM的相关研究和资料

Posted on 2011-03-09 15:52  lucio  阅读(1061)  评论(1)    收藏  举报

       最近公司给了一个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;

  2 using System.Collections.Generic;
  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(truethis.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

      创建Acrobat表单
      方便的浏览、标记和批阅
      在文档中使用数字媒体
      自定义用户界面
      搜索和索引文档和文档元数据
      使文档更安全
      管理使用权限
      与数据库交互
      与web服务交互
      XML

   可以做一个假的效果出来,但是始终无法处理移除掉原来的权限设置...,附录:下面是一些网上搜集的资料,留个备份:

 

   //adobe官网提问如下

http://forums.adobe.com/message/3281099#3281099;
http://itext-general.2136553.n4.nabble.com/
http://itext-general.2136553.n4.nabble.com/The-IRM-Issue-of-PDF-File-tc3054793.html#none
http://topic.csdn.net/u/20101109/10/3fef9cda-6b4f-4360-a873-c9d557643328.html
//通过pdf调用WS‘
http://forums.adobe.com/thread/716703?tstart=180
//SDK加密
http://forums.adobe.com/thread/699447?tstart=240
//批处理,加密
http://forums.adobe.com/thread/727064?tstart=120
//插件
http://forums.adobe.com/thread/735696?tstart=90
//PDF文档管理系统概述
http://wenku.baidu.com/view/fc6f8a8102d276a200292e59.html
//官方的插件描述
http://www.adobe.com/devnet/reader/articles/plug_in_architecture.html
//怎样开发插件sdk[]
http://www.mactech.com/articles/mactech/Vol.16/16.06/AcrobatPlugins/
//其他论坛
http://www.justskins.com/forums/adobe-acroba t-sdk-14/
http://www.justskins.com/forums/the-irm-issue-of-150829.html#post506144
//注入 渗透 拦截
http://dll-injection.safe-install.com/
//读取流文件,判断文件的具体类型
http://topic.csdn.net/u/20070804/11/9dc4fb73-6ce6-4b26-ad2c-8085eb1739e8.html
//acrobat javascript指南
http://www.cnblogs.com/mumuliang/archive/2010/06/30/1873524.html
//windows RMS 简介
http://hi.baidu.com/magicboygod/blog/item/7df299017f4ad3d0267fb5d3.html/cmtid/08b20e38a5d871feb311c7f3
//据说实现了离线文档权限管理系统的一个啥睿锁电子文档权限管理系统
http://www.youxia.org/2009/02/Smartlcok.html