web-dev-qa-db-fra.com

Comment convertir un PDF de la chaîne base64 en un fichier?

J'ai un PDF en tant que chaîne base64 et je dois l'écrire dans un fichier en utilisant Python. J'ai essayé ceci:

import base64

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

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

Mais il n'a pas créé de fichier PDF PDF valide. Que me manque-t-il?

9
Rafael Miller

D'après ma compréhension, base64decode ne prend qu'une chaîne base64 et semble que vous avez des en-têtes sur votre chaîne qui ne sont pas codés.

Je supprimerais "data: application/pdf; base64,"

consultez le doc ici: https://docs.python.org/2/library/base64.html

Quand je l'ai utilisé dans le passé, je n'ai utilisé que la chaîne codée.

6
Mark

L'écrit-il en utilisant le codecs.decode fonction de travail? également comme Mark l'a dit, vous pouvez essayer de supprimer le data:application/pdf;base64, partie de la chaîne car cette section de la chaîne ne doit pas être décodée .:

import codecs
base64String = "JVBERi0xLjQKJeHp69MKMSAwIG9iago8PC9Qcm9kdWNlciAoU2tpYS9..."


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

Ce ne sont pas seulement des données encodées en base64, mais encodées en uri de données:

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

Il existe un autre article sur le débordement de pile demandant comment analyser de telles chaînes en Python:

Comment analyser data-uri en python?

L'essentiel est de supprimer l'en-tête (jusqu'à la première virgule incluse):

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

REMARQUE: j'utilise [1: 2] au lieu de [1] car il ne lèvera pas d'exception s'il n'y a qu'un seul élément dans la liste car rien ne suit la virgule (données vides).

1
Forest Darling