วันพฤหัสบดีที่ ๙ กรกฎาคม พ.ศ. ๒๕๕๒

การจัดการเอกสาร pdf ด้วย iTextSharp (2)

หลังจากที่ผมได้นำโปรแกรมไปให้ user ทดสอบ ก็เลยได้ requirement เพิ่มเติมมาอีกครับ คือ user บางกลุ่มจะไม่สามารถ print pdf ออกไปที่ printer ได้ และห้าม save ด้วย

หลังจากเข้าไปอ่านเอกสารของ iTextSharp ก็พบว่ามันสามารถทำได้ครับ โดยตัว pdf เองนั้นเราสามารถทำการกำหนด permission ได้ และ iTextSharp มี class ชื่อ PdfWriter ซึ่งเราสามารถทำการ Set Encryption เพื่อกำหนด permission ของ pdf ได้ ดังนั้นจากโค้ดเดิมที่ทำไว้ ผมก็ไปเพิ่มคำสั่ง setEncryption ก่อนสั่ง document.open ครับ

เนื่องจากโค้ดเดิมผมใช้ PdfCopy object สำหรับสร้างเอกสาร pdf ใหม่ แต่ว่า PdfCopy มันไม่มีคำสั่ง setEncryption ครับ พอลองไป view object browser ดูก็พบว่าตัว PdfCopy นั้นมัน inherit มาจาก PdfWriter อีกที ดังนั้นเราสามารถ Casting ไปเป็น PdfWriter ได้ครับ จากนั้นก็สั่ง SetEncryption เพื่อกำหนด permission ว่าจะให้ print ได้หรือไม่ และก็สั่งซ่อน menu bar และ toolbar เพื่อที่ว่า user จะได้สั่ง save ไม่ได้ครับ



Dim writer As PdfWriter = TryCast(copy, PdfWriter)
'writer.SetEncryption(PdfWriter.STANDARD_ENCRYPTION_128, Nothing, Nothing, PdfWriter.ALLOW_SCREENREADERS) '// CANNOT PRINT
writer.SetEncryption(PdfWriter.STANDARD_ENCRYPTION_128, Nothing, Nothing, PdfWriter.ALLOW_PRINTING) '// CAN PRINT
writer.ViewerPreferences = PdfWriter.HideMenubar + PdfWriter.HideToolbar + PdfWriter.HideWindowUI

document.Open()
For i As Integer = 1 To reader.NumberOfPages
Dim ipage As Integer = i
If intIgnorePages Is Nothing OrElse intIgnorePages.Find(Function(c) c = ipage) = 0 Then
copy.AddPage(copy.GetImportedPage(reader, ipage))
End If
Next

document.Close()
reader.Close()
copy.Close()
fs.Close()
fs.Dispose()


เรียบร้อยครับ แหมมันช่างเยี่ยมยอดจริงๆ

1 ความคิดเห็น:

arareh กล่าวว่า...

บทความเป็นประโยชน์มากเลยค่ะ แต่ตอนนี้งงกับคำสั่ง เพราะปกติใช้ C# เลยไม่รู้ว่า
Public intIgnorePages As List(Of Integer) จะกำหนดยังไง และ trycast จะกำหนดยังไงค่ะ