1

I am using Google Functions in order to generate PDFs.

I want to store the PDFs in a Google Bucket.

I know that I can store PDFs as a file using the following code:

# Write PDF to HTML
pdf = "<html><title>Hello</title><body><p>Hi!</p></body></html>"

# HTML to PDF at local disk
document = weasyprint.HTML(string=pdf, encoding='UTF-8')
document.write_pdf(f"Hello.pdf")

However I want to store it in a Google Bucket, so I have tried the following code :

# Write PDF to HTML
pdf = "<html><title>Hello</title><body><p>Hi!</p></body></html>"

# HTML to PDF in Google Bucket
document = weasyprint.HTML(string=pdf, encoding='UTF-8')
client = storage.Client()
bucket = client.get_bucket("monthly-customer-reports")
blob = bucket.blob("Hello.pdf")
with blob.open("w") as f:
    f.write(str(document))

This stored a PDF in my Google Bucket but it was invalid.

Europa
  • 974
  • 12
  • 40

1 Answers1

1

You are trying to write the string representation of the document object to the file, but this is not a PDF binary data, what you could do is convert to convert to binary then write it directly to Google Cloud storage.

from google.cloud import storage
import weasyprint

pdf = "<html><title>Hello</title><body><p>Hi!</p></body></html>"

document = weasyprint.HTML(string=pdf, encoding='UTF-8')
pdf_bytes = document.write_pdf()

client = storage.Client()
bucket = client.get_bucket("monthly-customer-reports")
blob = bucket.blob("Hello.pdf")
blob.upload_from_string(pdf_bytes, content_type='application/pdf')
Saxtheowl
  • 4,136
  • 5
  • 23
  • 32