メタデータを取り扱う

過去、メタデータにいつ写真が撮られたかなどの情報が入っていると聞いたことがあり、写真を公開する前には見せたくない情報が記載されていないか確認をして見せたくない情報を削除したい。

そのため、画像についてメタデータの確認方法と削除方法を調査し始めたが、PDFや動画ファイルにもメタデータが含まれていることを知ったので合わせて記載する

普段はスマートフォンで撮った写真をSNSにアップロードするときなど気にするので使用している

SNSでPDFや画像、動画ファイルなどをアップロードするときに、作者情報やExif情報など個人情報に近しい情報を削除してくれないときに使用する。例えば、zipで圧縮して提出するときが想定される。

一方で画像や動画は直接ファイルをアップロードすることも多くSNS側で表示する前にファイルが複製されるのか、ダウンロードしたときにメタデータが消えている場合もある。

そのため、SNS側でメタデータを削除してくれているか確認する方法としては試験的に問題のない画像や動画をアップロードして試してみるとよい

自分のメタデータの取り扱い方は以下の通りだ

flowchart TD A([アップロードしたいファイルがある]) --> B[メタデータを確認する] B[メタデータを確認する] --> C[メタデータを削除する] C[メタデータを削除する] --> D[メタデータを確認する] D[メタデータを確認する] --> E{メタデータは問題ないか?} E ---->|YES| F([ファイルをアップロードする]) E ---->|No| G([アップロードを中断し別な方法を検討する])

ソフトウェアと実行環境を記載する

  • PDF → Python、pypdf
  • 画像 → ImageMagick
  • 動画 → ffmpeg
  • Windows11
  • コマンドプロンプト

MacやLinuxは未確認だが、PythonもImageMagickもffmpegも使用できるので可能かと思われる

Pythonプログラミングやコマンドプロンプトで対応する
Windows10以降はデフォルトでPowershellであるが同様に使用できる
どうしても使用できないときだけコマンドプロンプトに切り替えればよい

Pythonのソースコードを用意してコマンドプロンプトで実行する

# 確認
import pypdf

infile = pypdf.PdfReader("sample.pdf", "rb")

for k in infile.metadata.keys():
    print(k, ':', infile.metadata[k])
# 削除
import pypdf

infile = pypdf.PdfReader("sample.pdf", "rb")
output = pypdf.PdfWriter()

output.clone_Reader_Document_Root(infile) # 以前と同様に処理されず別のメタデータに更新されるため別項で提案する
output.add_metadata({'/Producer': "e"}) # 作者情報を追加する
output.write("output.pdf")

コメント

実際に試してみると分かるが、PDFであれば編集者情報も掲載される
過去にBoothやnoteでPDFファイルをZIPファイルに入れてアップロードするときにまずい状態になることに気付いた
逆にKindleにPDFをアップロードするときには、公開時はPDFの形式ではないため気にする必要がなかった

より使いやすく

pythonをexe化してpdfをドラックアンドドロップ出来るようにする
また、削除についてはpypdfが更新されたためか意図した通りには動作しないことが分かったため、その点も含めて更新する

import sys
import os
import pypdf

# ファイルパスの表示
if len(sys.argv) > 1:

    # フルパスと拡張子を確認する
    full_path = os.path.abspath(sys.argv[1])
    ext = os.path.splitext(full_path)[1]
    print("file path: " + full_path)
    print("file extension:" + ext)

    # pdfファイルでない場合は終了する
    if ext != ".pdf":
        print("ドラックしたファイルはpdfファイルではありません")
        sys.exit()

else:
    print("pdfファイルをexeにドラックアンドドロップしてください")
    sys.exit()

user_input  = input("How do you handle this file's metadata ? (d: delete, other: not delete, display metadata): ")

# メタデータを取り扱う
if user_input == "d":
    
    print("メタデータを削除します↓")
    pdf_output = pypdf.PdfWriter(clone_from=full_path)

    # メタデータの値を更新する(値を空白にして削除したように見せる)
    for k in pdf_output.metadata.keys():
        pdf_output.add_metadata({k: ""})

    print("metadata deleted.")
    pdf_output.add_metadata({'/Author': "e"})
    pdf_output.write(os.path.splitext(full_path)[0]+"_output.pdf")
    
    # 一旦、終了する
    pdf_output.close()

    # メタデータを確認する
    print("メタデータを表示します↓")
    pdf_output = pypdf.PdfReader(os.path.splitext(full_path)[0]+"_output.pdf")

    for k in pdf_output.metadata.keys():
        print(k, ':', pdf_output.metadata[k])

else:
    # メタデータを確認する
    print("メタデータを表示します↓")
    pdf = pypdf.PdfReader(full_path)

    for k in pdf.metadata.keys():
        print(k, ':', pdf.metadata[k])

print("終了するにはキーを押してください")
input()

コマンドプロンプトで実行する

# 確認
identify -verbose 画像ファイルのパス/画像ファイル名.png
# 削除
mogrify -strip 画像ファイルのパス/画像ファイル名.png

コメント

画像にはGPSの情報が含まれている可能性があり、知らず知らずの内にGPSの埋め込みをONにするとどこで撮影した写真か分かる
スマホのGPSの連携はしていなかったつもりだが、どちらの方角に向かって撮影したか情報は残っていた。
また、撮影日時などの情報はデフォルトで書き込まれている。捉え方次第ではあるが気にする情報かと思う。
従って、第三者に向けて、生の写真データを公開する場合にはメタデータの削除が必要となる。

より使いやすく

毎回、コマンドプロンプトやPowerShellを立ち上げて上キーからコマンド履歴をで検索して実行するのは面倒だ
そこで、バッチファイルに画像ファイルをドラックアンドドロップするとメタデータを取り扱えるようにした

@echo off
rem ドラック&ドロップしたファイルパスを表示する

echo "file path is: " %1

rem メタデータの取り扱いを確認する
set /p  input="How do you handle this file's metadata ? (d: delete, other: not delete, display metadata): "

rem メタデータを取り扱う
if "%input%" == "d" (
    rem メタデータの削除
    echo.
    echo "メタデータを削除します↓"
    mogrify -strip %1
    rem メタデータの確認
    echo.
    echo "メタデータを表示します↓"
    identify -verbose %1
) else (
    rem メタデータの確認
    echo.
    echo "メタデータを表示します↓"
    identify -verbose %1
)

pause

コマンドプロンプトで実行する

# 確認
ffmpeg -i .\output.gif -f ffmetadata
# テキストに吐き出す > でリダイレクトしないので注意
ffmpeg -i .\output.gif -f ffmetadata output.txt
# 削除
ffmpeg -i output.gif -map_metadata -1 output2.gif

コメント

Youtubeに関してはストリーミング配信のため気にしないかもしれない
基本的に生のデータを扱うことはなく、加工や編集を重ねてPCの動画編集ソフトで別なファイルに仕上げるとは思うが
念の為、完成品をアップロードする前にメタデータを確認してみるとよいだろう

より使いやすく

画像ファイルと同じ様にバッチファイルに動画ファイルをドラックアンドドロップするとメタデータを取り扱えるようにした

@echo off
rem ドラック&ドロップしたファイルパスを表示する

echo "file path is: " %1

rem メタデータの取り扱いを確認する
set /p  input="How do you handle this file's metadata ? (d: delete, other: not delete, display metadata): "

rem メタデータを取り扱う
if "%input%" == "d" (
    rem メタデータの削除
    echo.
    echo "メタデータを削除します↓"
    ffmpeg -i %1 -map_metadata -1 %~dp1%~n1_out%~x1
    rem メタデータの確認
    echo.
    echo "メタデータを表示します↓"
    ffmpeg -i %~dp1%~n1_out%~x1 -f ffmetadata 
) else (
    rem メタデータの確認
    echo.
    echo "メタデータを表示します↓"
    ffmpeg -i %1 -f ffmetadata 
)

pause

削除した後も許容できるか確認することでリスクを回避できることが分かった
例えば、PDFを公開するときなど不必要に情報を公開したくないことがあると思う。
特に生データでファイルをアップロードするときには不安が募るので知ってからは活用している
コマンド忘れてもWikiに残してあるので便利だ

スマートフォンも位置情報を使用するので、便利な一方でリスクも増えたと言える
特に日本だとプライバシーが重視されるので覚えておいても損はない

  • meta.txt
  • 最終更新: 2024/05/16 22:41
  • by educator