Один из вариантов - это выдавать на клиент не конечный документ, а контейнер-просмотрщик, например на flash. Таким образом даже в кэше на клиенте оказывается только сам просмотрщик, а не документ. Flash в свою очередь так же должен запрашивать документ не напрямую а через прослойку + авторизация.
Можно еще для пущей защиты на принтскрин "затенять" документ, но это конечно не убережет вас о от фотографирования экрана и снятия скринкаста. Абсолютных решений защиты данных до которых пользователь Уже получил доступ не существует, как минимум он их может переписать на листок или просто запомнить. Так что при постановке задачи нужно выработать четкие требования к уровню защиты и придерживаться их.