2011年5月29日 星期日

如何使用JasperReports加密PDF檔(How to produce encrypted PDF with JasperReports)

版本
JasperReports版本為4.0.1。

加密結果預覽




說明
在前兩篇文章中,
如何在JasperReports中製作Subreport
如何在JasperReports中製作分組(Group)加總
使用JasperExportManager來產生PDF檔案,方法為:


但是!人生最無奈的就是這個但是!

如果要針對這個報表進行加密,要怎麼做?
若要限制讀者不能複製或列印,要怎麼做?

這時候就不能使用JasperExportManager來製作PDF檔案了,
而須改用JRPdfExporter,方法為:


上述程式僅僅描述了如何使用JRPdfExporter產生PDF檔案,
還沒有說明本文的主題:加密PDF。
但是,我相信閣下應該已經猜得出來了!
答案很簡單,就是利用JRPdfExporterParameter:


使用JRPdfExporter後,可以利用setParameter方法,
調整PDF檔案的參數(JRPdfExporterParameter)。
JRPdfExporterParameter包含了許多參數項目,
其中設定加密及保護PDF文件的參數,總共有五種,分述如下:

IS_ENCRYPTED:是否加密PDF文件,值為true或false。
IS_128_BIT_KEY:使用預設的40 bits的key或是128 bits的key來加密,值為true或false。
USER_PASSWORD:設定一般使用者的密碼,值為字串。
OWNER_PASSWORD:設定檔案擁有者的密碼,值為字串。
PERMISSIONS:設定一般使用者的權限,例如允許列印、允許複製內文等等,值為整數。

如果要設定一般使用者可以複製內文,方法為:


若要允許可以複製內文,也可以列印,則是利用bitwise OR來組合:


除了密碼和權限控制外,
我們也能夠利用JRPdfExporterParameter中的參數項目,
來設定PDF檔案的meta data,例如標題、檔案擁有者等等。
這些參數項目,你可以透過官方API文件來找到,
或直接參考本文的完整程式碼。

完整程式碼


本文的jrxml,
可以在如何在JasperReports中製作分組(Group)加總中下載。

番外篇
bitwise為位元運算,
因此在進行運算時,必須先將值轉換成二進位,亦即以0與1來表示。
bitwise operator(位元運算子)有OR, AND, NOT 和XOR四種。
其中bitwise OR表示兩個值之間,只要其中一個等於1,則結果就為1,
例如:
1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0

    11
OR  10
 =  11

   101
OR 011
 = 111

使用bitwise OR來組合不同的設定是很常見的程式技巧,
可以判斷1在運算結果中的位置,來知道有哪些設定。

查看PdfWriter的原始碼可以發現,ALLOW_XXX的值為皆為2的次方:


以ALLOW_COPY和ALLOW_FILL_IN為例,換成二進位後,
ALLOW_COPY = 000000010000
ALLOW_FILL_IN = 000100000000        
將兩者進行bitwise OR後,值就變成了:000100010000
後續的程式只要判斷這個值中1的位置,就能知道要設定哪些權限了。

相信閣下一定有注意到ALLOW_PRINTING的值是2052,並不是2的次方啊!
這是因為既然ALLOW_PRINTING(允許列印),
當然就ALLOW_DEGRADED_PRINTING(允許低品質列印)!

番外篇結語

使用bitwise OR來組合不同的設定,
最重要的(也是最基本的)的前提就是,
每個設定的值,都必須是2的次方。

判斷1在運算結果中的位數,來知道有哪些設定存在。

沒有留言:

張貼留言