質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Q&A

解決済

1回答

2156閲覧

PDFの印刷制限を無視するソフトに対する印刷禁止方法

ikadzuchi

総合スコア3047

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

2グッド

4クリップ

投稿2020/10/10 09:30

firefoxにおけるpdfの印刷禁止方法についてを受けての質問です。
PDFの印刷制限(パスワード)がFirefoxで無効になってしまうということで、それを禁止する方法について、当該スレッドにおいて「アクセスしにくくする」以上の案は出てこなかったものの、kuma_kuma_さんによれば「一応方法はある」が「ただ大きな手間や知識は必要」とのことです。

私の理解では、PDFの印刷制限とは単にフラグを立てているだけで、Firefoxを始めとする、それを無視するソフトには制限は効かないものと思っています。
表示ができている以上、それを印刷できないという状況は考えづらく、紳士協定で「印刷しないことにする」以外の方法が思いつきません(そしてそれが通常の印刷制限機能だと思っています)。
このような状況において(アクセスできなくするのではなく)印刷を禁止できる方法があるというのは技術的に大変興味深いことですので、その方法について知りたいと思います。
あるいは上の理解が間違っていましたら教えて下さい。

基本的にkuma_kuma_さんからの回答を求めますが、他の方からの回答も歓迎します。

tanat, dodox86👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuma_kuma_

2020/10/10 09:48

ikadzuchiさん了解しました。 以降はこちらでのやり取りをメインにさせて下さい。 それでは回答を行う前にいくつか確認事項がありますが質問させてください。 1. まず使うベースとなる言語はHTMLです。かまわないでしょうか? 2. PDFに関してですが目的が「コピーをさせたくない」と認識していますので BASE64へ形式を行いますががよろしいでしょうか? (単純なURLの場合ネットワークで判ってしまうため) 3.前回の質問の意図は「印刷させない」「ダウンロードさせない」の2点でしたが 「ハードコピーさせない」は含めなくてよろしいでしょうか? 4.厳密に言えばソースコードを解析すればPDFの復元が可能です。 (当然それに対して単純に解析できないようにしますが。) その事はご了承してもらえますでしょうか? 5.PDFのサンプルは当方で用意しますが問題ないでしょうか? 6.ベースとなるコードが存在します。コードの解説はしますがこちらに記載できる部分は一部となります。また実行環境として私個人のURLを使用します。(付随ファイルなどの関係)問題ないでしょうか?
ikadzuchi

2020/10/10 09:57

1. はい、構いません。 2. 私の質問は(ファイル自体の)コピーは含まず、印刷の禁止のみです。その上で必要なのであれば構いません。 3. はい、構いません。 4. はい、構いません。通常よりわずかでも印刷が困難になるようであれば題意に沿っています。 5. はい、構いません。 6. 可能な限りteratail側に情報が残るようにしていただきたいですが、不可能なら構いません。
ikadzuchi

2020/10/10 09:58

なお、必ずしも動作するサンプルを提示していただく必要はなく、方法さえ教えていただければそれで構いません。
ikadzuchi

2020/10/10 10:03

(なんとなく、「ブラウザ上で動くPDFビューアを実装し、暗号化したPDFデータを受信して表示」な気がしてきた)
kuma_kuma_

2020/10/10 10:11

> (なんとなく、「ブラウザ上で動くPDFビューアを実装し、暗号化したPDFデータを受信して表示」な気がしてきた) 正解です。 > なお、必ずしも動作するサンプルを提示していただく必要はなく、方法さえ教えていただければそれで構いません。 ビューア自体は公開されているものを使用しますので解説は必要ないかと思います。 あとは手段だけ書こうかとも思いましたがどの程度できなくなるかは実際見てもらう必要があったので サンプルの提示を提案させていただきました。 技術力がある方は、さすが察しがよくて余計な説明が要らなく助かります。 回答を書いた方がよろしいですか?
ikadzuchi

2020/10/10 10:27

そうですね、回答お願いします。
kuma_kuma_

2020/10/10 10:30

わかりました。 内容にボリュームがあるのと検証確認(処理にバグや抜け道がない事)を行うので 少々お時間をいただきます。 ご了承ください。
guest

回答1

0

ベストアンサー

PDFビュワーはPDF.jsを使用します。
PDF.js

各ファイルやセッティングは各自調べてみて下さい
ファイルを解凍して「viewer.html」を実行すればブラウザ上でPDFが見れる事を確認できます。
※最新版にしたところIE11でエラーとなり表示できなくなっています。
どちらで作るか悩みましたが最新版で作業をおこないます。
(旧版が手に入らない可能性も含め)

PDFのサンプルが表示されていると思いますが初期に表示させたくないので
viewer.js 3573行目
value: "compressed.tracemonkey-pldi-09.pdf",

value: "",
として下さい

対象となるPDFは事前準備としてBASE64テキストに変換
WindowsでBase64エンコード/デコードする方法
certutil -f -encode "input.pdf" "output.txt"

今回はJSファイルに偽装しました。

BASE64テキスト変換したファイルをテキストエディタで開いて

text

1-----BEGIN CERTIFICATE----- 2JVBERi0xLjcKC ... 3... ZWYKNDkyCiUlRU9G 4-----END CERTIFICATE-----

1行目 "-----BEGIN CERTIFICATE-----" を var datamap = '
最終行 "-----END CERTIFICATE-----" を ';
に変え改行をすべて削除

text

1var datamap = 'JVBERi0xLjcKC ... ZWYKNDkyCiUlRU9G';

この辺りはWebの場合なら
JavaScriptでcsv読み込み
のようにして無加工BASE64形式でファイルを読む仕組みでも構いません。
(ローカルで済ませたくてこの様な形にしているだけです)

後は「viewer.html」のヘッダ部分に以下を追加
※ 今回判りやすくヘッダ記載としていますが、実際使う際はJSファイルの「圧縮・難読化」した状態として下さい。

HTML

1 <script src="test.js"></script> <!-- 偽装したPDFファイル --> 2 3 <script type="text/javascript"> 4 var overlay; 5 window.onload= function(){ 6 let el; 7 el = document.getElementById("openFile"); 8 el.parentNode.removeChild(el); 9 el = document.getElementById("print"); 10 el.parentNode.removeChild(el); 11 el = document.getElementById("download"); 12 el.parentNode.removeChild(el); 13 overlay = document.createElement('div'); 14 overlay.id = 'overlay'; 15 overlay.style.position = 'absolute'; 16 overlay.style.left = "0"; 17 overlay.style.top = "0"; 18 overlay.style.width = "100%"; 19 overlay.style.height = "100%"; 20 overlay.style.background = "rgba(64, 64, 64, 0.99)"; 21 overlay.style.zIndex = "2147483647"; 22 overlay.style.display = "none"; 23 document.body.appendChild(overlay); 24 el = document.createElement('style'); 25 el.type = "text/css"; 26 document.head.appendChild(el); 27 document.styleSheets.item( document.styleSheets.length - 1).insertRule(" * { -webkit-touch-callout: none !important; -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important;}", 0); 28 document.styleSheets.item( document.styleSheets.length - 1).insertRule("@media print { body { display: none !important; } }", 0); 29 document.onselectstart = function(){return false;} 30 document.oncontextmenu = function(){return false;} 31 document.ondragstart = function(){return false;} 32 document.oncopy = function(){return false;} 33 document.onMouseDown = function(){return false;} 34 window.addEventListener('blur', function(){ overlay.style.display = ""; }); 35 window.addEventListener('focus', function(){ overlay.style.display = "none"; }); 36 window.addEventListener("keydown", function(e){ 37 if(e.ctrlKey || e.altKey || e.keyCode == 91) overlay.style.display = ""; 38 }); 39 window.addEventListener("keyup", function(e){ 40 if(!e.ctrlKey && !e.altKey) overlay.style.display = "none"; 41 if(e.keyCode == 44 || e.keyCode == 91){ 42 try { navigator.clipboard.writeText(''); } catch (error) {} 43 } 44 }); 45 46 PDFViewerApplication.open(loadData(datamap)); 47 function loadData(d) { 48 var raw = atob(d); 49 var uint8Array = new Uint8Array(new ArrayBuffer(raw.length)); 50 for (var i = 0, len = raw.length; i < len; ++i) { 51 uint8Array[i] = raw.charCodeAt(i); 52 } 53 return uint8Array; 54 } 55 } 56 </script>

コメント残そうかとも思ったんですが
せっかくのセキュリティ台無しになりそうなのでやめておきます。

確認ブラウザ(windows 64bit)

  • IE11 (PDF.js最新版だとエラーが発生して使えず)
  • Firefox 81.0.1
  • Chrome 86.0.4240.75
  • Edge 86.0.622.38

確認用サイトも準備しようとしたのですが、必要ないとの事なので行っていません。
もし必要ならおっしゃって下さい。

ただ先にも書きましたが、開発コンソールから追いかければ文字自体は取得できてしまいます。
(ただし文字の位置や画像までとなると相当大変ですが)

以上が「PDFを印刷・ダウンロード・プリントスクリーンさせず表示する方法」となります。

追記
※ プリントスクリーンの対策がアクティブウインドウ時のみだった為処理を追加

追記2
しばらくは残しておきますが時間がたてば消します。
PDF.js viewer(対策版)
PDF.js viewer(未対策版)
※ 未対策版はPDFを表示後読み込ませて下さい。

追記3
一部ノートパソコンでのプリントスクリーンに対応

投稿2020/10/10 16:15

編集2020/10/11 13:25
kuma_kuma_

総合スコア2506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2020/10/10 16:59

ハードコピーとはプリントスクリーンの事を指していますか?
kuma_kuma_

2020/10/10 17:01

はい。表現が悪かったですね訂正しておきます。
hentaiman

2020/10/10 17:09

アクティブウィンドウがブラウザになっているという条件付きでしょうか
kuma_kuma_

2020/10/11 07:24 編集

> アクティブウィンドウがブラウザになっているという条件付きでしょうか 追記で非アクティブウィンドウにも対応しました。 (本来はフィルターがかかった状態のほうが見栄えは良いですが...) 追記 フィルター対応しました。
ikadzuchi

2020/10/11 04:09

回答ありがとうございます。 これでどの程度印刷が禁止できているかは確認していませんが、少なくとも私の考えていた「PDFの印刷制限を無視するソフトに印刷制限を掛ける」という手順以外に可能性があることが分かりました。 疑問が解決しましたのでベストアンサーです。
kuma_kuma_

2020/10/11 07:04

ikadzuchiさんほどの技術力があれば判ると思いますが。 今回は対象が「PDF」でしたが、 このソースの一部を利用すれば、HTMLで表示した場合でも応用が利きます。 (共通化を意識して作っています。) > これでどの程度印刷が禁止できているかは確認していませんが やはりどこかにサンプル用意しますか?
hentaiman

2020/10/11 07:27

サンプル見て見たいですね 試してみたい
kuma_kuma_

2020/10/11 08:31

> サンプル見て見たいですね 試してみたい URL貼っておきます。
hentaiman

2020/10/11 12:39

すごいですね~ アクティブ時にプリントスクリーンが効いてしまってましたが、使っているパソコンの問題かな あとすいません未対応版はよくわかりませんでした ありがとうございました
kuma_kuma_

2020/10/11 13:06 編集

> アクティブ時にプリントスクリーンが効いてしまってましたが プリントスクリーン自体はできても内容は真っ黒のはずですが... もしよろしければ環境などを教えて下さい。(どうやってキーを押したか) あとさすがに録画や他ソフトからキャプチャ(タイマー付)には対応できません。 (Macが当方にないのでその場合の対策は甘いのは確かです)
hentaiman

2020/10/11 13:11

内容も黒く無いです。表示内容そのままキャプチャーできました。 デバイスドライバが一般的ではない事が理由かと思いますが、使用しているPCが「HP Spectre Laptop 13af0xxx」というノートで、キーボード配列が特殊ででドライバも一般的なものとは違うからかなと思います。
kuma_kuma_

2020/10/11 13:23

ノートパソコンだとキャプチャーのキーが違うのですね 対応しておきました。
hentaiman

2020/10/11 14:41

やっぱりプリントスクリーンボタンひとつ押すだけだとキャプチャー出来ますね、ドライバーが特殊だと 対応難しそうですね > ノートパソコンだとキャプチャーのキーが違うのですね それだけなら問題なさそうなんですが、記載した型のパソコンだとそこら辺で売ってるキーボードも入力がデタラメでまともに使えないんですよ、ドライバーが原因の場合は対処難しそうですね マニアックなボタン(PrtScreen)の対処が難しいだけっぽいので、ctrl・alt・shiftと同時に押さなきゃいけないような操作なら問題なさそうですね
kuma_kuma_

2020/10/11 14:50

> プリントスクリーンボタンひとつ そうなんですか?調べたら「windowsキー+プリントスクリーンキー」だと思っていましたが... プリントスクリーンキーは特殊キーの部類でブラウザでは「押されたキーが離れる時」しか捕まえる事が出来ないんですね、そこで対策はしているのですがFirefoxのバグでその対応も効かない場合がある状態です。 そういう意味では「プリントスクリーン1キー」での対応は無理ですね。 (実物が無いので何とも言えませんが特別なソフトを介しての動作のようにも見えます。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問