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在運算結果中的位數,來知道有哪些設定存在。
沒有留言:
張貼留言