Geliştirme yaptığım domain içerisinde bazı ekranlardan,
· herhangi bir sunucuda halihazırda varolan PDF dokümanlarının download edilen,
· yine bazı ekranlardan anlık üretilme yoluyla download edilen
PDF dosyalarında güvenliği bir tık daha artırmak amacıyla, kopyalama yapılamaması ihtiyacı hasıl oldu. Bir tık diyorum çünkü kopyalama işlemi engellense dahi piyasada envaiçeşit "convert pdf to word" gibi tool 'lar mevcut.
Peki madem pdf üzerinde kopyalama işlemini engellemek bu soruna çözüm değil, neden böyle bir ihtiyaç doğdu? Burada aslında pdf dokümanın amacını doğru anlamak gerekiyor:
PDF dokümanı son kullanıcı için tasarlanan, üzerinde değişiklik yapılmasının zaten istenilmediği bir uzantıdır. Bellibaşlı verilerin derlenip toparlanması veya analiz-raporlama gibi işlemlerin sonucu olarak kullanılması amaçlanan veyahut görüş bildirmek için kullanılan, mail vb. gibi yollarla son kullanıcıyla paylaşılan bir dosya türü denilebilir.
Koda geçmek gerekirse örnek olarak bir pdf download işlemi aşağıdaki gibi yapılıyor olsun:
var commonBo = new CommonBo(); string fileName = Request.QueryString["filenamePdf"]; string fileFolder = Server.MapPath("~/Templates/Temporaries/"); string htmlText = File.ReadAllText(fileFolder + fileName); byte[] content = commonBo.HtmlToPdfConverter(htmlText); HttpContext.Current.Response.Clear(); HttpContext.Current.Response.Charset = "utf-8"; Response.ContentType = "application/pdf"; HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName + ".pdf"); HttpContext.Current.Response.OutputStream.Write(content, 0, content.Length); HttpContext.Current.Response.End(); HttpContext.Current.Response.Close();
kullandığım örnekte pdf in beslendiği kaynak olarak html kullandım. Html den pdf e dönüştürme konusu apayrı bir konu fakat extra bilgi olması açısından "NReco", "TuesPechkin" gibi bazı 3th part dll ler kullanılabilir. Sonuç olarak stream e aktarabilecek bir byte array yeterli.
İndirilen pdf in kopyalanabildiği görülmekte, kopyalanamaması için download başlamadan önce program akışında araya girmek bir yöntem. Bu özelliği sağlayan Adobe 'un lisans gerektiren hatta bildiğim kadarıyla şu tarih-saat itibariyle indirme başına lisans isteyen sdk sı mevcut fakat ben örnekte "iTextSharp" olarak bilinen ücretsiz bir dll kullanacağım, şuan için son version:
using iTextSharp.text.pdf;
var commonBo = new CommonBo();
string fileName = Request.QueryString["filenamePdf"];
string fileFolder = Server.MapPath("~/Templates/Temporaries/");
var htmlText = File.ReadAllText(fileFolder + fileName);
byte[] content = commonBo.HtmlToPdfConverter(htmlText);
using (MemoryStream input = new MemoryStream(content))
{
using (MemoryStream output = new MemoryStream())
{
PdfReader reader = new PdfReader(input);
PdfEncryptor.Encrypt(reader, output, PdfWriter.DO_NOT_ENCRYPT_METADATA, null, "", PdfWriter.AllowPrinting);
content = output.ToArray();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName + ".pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.BinaryWrite(content);
Response.End();
}
}
"iTextSharp" dll i içerisindeki "Encrypt" metodunu kullanara verilen "PdfWriter" options ları ile pdf üzerinde yapılmasına izin verilen özellikler "Allow" diyerek belirtilmeli.
Permission Setting bölümünden de görüldüğü üzere "Printing" haricindeki "Content Copying" dahil tüm yetkiler "Not Allowed" durumunda.
Umarım faydalı olmuştur. Başka bir yazıda görüşmek dileğiyle, hoşçakalın ..