web-dev-qa-db-ja.com

PDF= base64文字列からファイルに変換する方法は?

PDFがbase64文字列としてあり、それをPythonを使用してファイルに書き込む必要があります。これを試しました:

import base64

base64String = "data:application/pdf;base64,JVBERi0xLjQKJeHp69MKMSAwIG9iago8PC9Qcm9kdWNlciAoU2tpYS9..."

with open('temp.pdf', 'wb') as theFile:
  theFile.write(base64.b64decode(base64String))

しかし、有効なPDFファイルが作成されませんでした。何が不足していますか?

9
Rafael Miller

私の理解では、base64decodeはbase64文字列のみを受け取り、文字列にエンコードされていないヘッダーがあるようです。

「data:application/pdf; base64」を削除します

こちらのドキュメントをチェックしてください: https://docs.python.org/2/library/base64.html

過去に使用したことがある場合は、エンコードされた文字列のみを使用しました。

6
Mark

codecs.decode関数を使用して書き込むことはできますか?また、マークが述べたように、文字列のこのセクションはデコードされないため、文字列のdata:application/pdf;base64,部分を削除してみることができます。

import codecs
base64String = "JVBERi0xLjQKJeHp69MKMSAwIG9iago8PC9Qcm9kdWNlciAoU2tpYS9..."


with open("test.pdf", "wb") as f:
    f.write(codecs.decode(base64string, "base64"))
2
Jebby

これは単にbase64エンコードされたデータではなく、data-uriエンコードされたものです。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs

Pythonでそのような文字列を解析する方法を尋ねるスタックオーバーフローに関する別の投稿があります。

pythonでdata-uriを解析する方法?

その要点は、ヘッダー(最初のコンマまでのすべて)を削除することです。

theFile.write(base64.b64decode(base64String.split(",")[1:2]))

注:[1]ではなく[1:2]を使用します。コンマ(空のデータ)の後には何もないため、リストに要素が1つしかない場合は例外がスローされないためです。

1
Forest Darling