kivantium活動日記

プログラムを使っていろいろやります

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 でダイアログ ボックスが開いていないことを確認します。

というエラーで開くことができなかった。

Pythonを使う方法は一般ユーザー向けではない最後の手段という感じがするので、もう少しユーザーフレンドリーな方法を考えたいところである……。