docxファイルに埋め込まれたPDFを読む方法
論文を読んでいたらsupplementary materialとして提供されたdocxファイルの中にPDFが埋め込まれていた。本来はダブルクリックすると開けるはずなのだが、どうしても開くことができず困ったので解決策をメモしておく。
結論
- 1: docxファイルのファイル名を変更して拡張子をzipに変更する。
- 2: zipファイルを解凍するなどして
word/embeddings
内にあるoleObject1.bin
を取り出す。(数字は異なる場合がある) - 3: WSLなどのPython環境で以下のスクリプトを実行する。
import os str1 = b'%PDF-' # Begin PDF str2 = b'%%EOF' # End PDF with open('oleObject1.bin', 'rb') as f: binary_data = f.read() # Convert BYTE to BYTEARRAY binary_byte_array = bytearray(binary_data) # Find where PDF begins result1 = binary_byte_array.find(str1) # Remove all characters before PDF begins del binary_byte_array[:result1] # Find where PDF ends result2 = binary_byte_array.find(str2) # Subtract the length of the array from the position of where PDF ends (add 5 for %%OEF characters) # and delete that many characters from end of array to_remove = len(binary_byte_array) - (result2 + 5) del binary_byte_array[-to_remove:] with open(os.path.expanduser('test1.pdf'), 'wb') as fout: fout.write(binary_byte_array)
- 4: 出力された
test1.pdf
をお好みのPDFリーダーで読む。
この方法は原理的にはxlsxファイルやpptxファイルにも使えるはずである。
ネタ元→ python 3.x - How can I decode a .bin into a .pdf - Stack Overflow
試したが失敗した方法
- Word内で埋め込みPDFをダブルクリックするのが正当な開き方なのだが、
このオブジェクトは Acrobat で作成されましたが、このプログラムがお使いのコンピューターにインストールされていないか、応答していません。このオブジェクトを編集するには、Acrobat をインストールするか、Acrobat でダイアログ ボックスが開いていないことを確認します。
というエラーで開くことができなかった。
- Adobeフォーラムの 解決済み: Wordに埋め込んだPDFが開かない - Adobe Community - 7722966 にあった「環境設定→セキュリティ(拡張)→起動時に保護モードを有効にする」のチェックを外す方法を試したが解消しなかった。
- PDF-XChange Co Ltd :: Knowledge Base :: I cannot view a PDF that is embedded in a Microsoft Word document. にはzipファイルとして開いて
oleObject.bin
の拡張子を変更してPDFとして読む方法が紹介されていたが、そのままではPDFとして読み込むことができなかった。 - How to extract embedded PDF from WORD document in Linux (Mac) - Stack Overflow でbinファイルをPDFに変換するシェルスクリプトが紹介されていたが、これで生成されるPDFも開くことができなかった。
- python 3.x - How can I decode a .bin into a .pdf - Stack Overflow 最終的にここで紹介されている方法なら読み込み可能なPDFを生成できることが分かった。
Pythonを使う方法は一般ユーザー向けではない最後の手段という感じがするので、もう少しユーザーフレンドリーな方法を考えたいところである……。