10 Mayıs 2019 Cuma

PDF Kopyalama Engeli (Disable Copy on PDF)

Selamlar,

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. 




İndirilen pdf de kopyalamanın lock landığı görülmekte ve ctrl+c de clipboard a almıyor.



Permission Setting bölümünden de görüldüğü üzere "Printing" haricindeki "Content Copying" dahil  tüm yetkiler "Not Allowed" durumunda.


İllaki başka yöntemler de vardır, Bu yöntem işimi hızlı bir şekilde gördüğü için paylaşıyorum. Başka yöntemlerin bilgisine sahip olan arkadaşlar isterlerse yorum olarak paylaşabilirler.

Umarım faydalı olmuştur. Başka bir yazıda görüşmek dileğiyle, hoşçakalın ..