Как добавить изображения в файл Pdf из статических файлов с помощью библиотеки borb и Django

Я хочу добавить изображение в файл pdf, изображения находятся в статическом каталоге:

'static/images/logo.png'

Файл настроек:

STATIC_URL = '/static/'

Часть кода:

from borb.pdf.canvas.layout.image.image import Image

page_layout.add(    
        Image(        
        "/static/images/logo.png",        
        width=Decimal(128),        
        height=Decimal(128),    
        ))

Код ошибки:

MissingSchema: Недопустимый URL '/static/images/Logo.png': No schema supplied. Возможно, вы имели в виду http:///static/images/Logo.png?

  • Я не хочу показывать это в шаблоне фронт-энда, вместо этого есть функция бэкэнда для генерации pdf.

  • Нужно ли мне предоставлять/генерировать какую-либо url-ссылку на функцию Image? Как это сделать?

Спасибо!

Отказ от ответственности: я Йорис Шеллекенс, автор вышеупомянутой библиотеки borb.

Конструктор Image либо принимает:

  • a str если вы собираетесь взять изображение с URL
  • a Path если вы собираетесь использовать локальное изображение в вашей файловой системе

Вы указали str, поэтому borb создается впечатление, что вы хотите использовать файл, который присутствует в вашей файловой системе.

Затем он пытается assert проверить, существует ли этот файл. Что не соответствует действительности. Отсюда и ошибка.

Решением было бы предоставить либо Path, либо полностью разрешенный путь к файлу в виде str.

Чтобы дополнить ответ Joris Schellekens, нам нужно передать объект type(Path), а не type(str), чтобы борб "понял", что это локальный файл.

Вы можете посмотреть эти другие вопросы, чтобы узнать, как преобразовать str в Path, но я привожу ниже полный пример, основанный на этой статье также от Joris, хотя и с некоторыми изменениями, чтобы исправить ошибки, которые у меня были при ее выполнении (pdf.add_page(page) вместо pdf.append_page(page), и from borb.pdf import Document вместо borb.pdf.document import Document).

Конечно, в коде измените путь к вашему логотипу и нужный вам размер и т.д.):

import os
from pathlib import Path
from decimal import Decimal 
# import third party libraries:
from borb.pdf import Document
from borb.pdf.page.page import Page
from borb.pdf.canvas.layout.page_layout.multi_column_layout import SingleColumnLayout
from borb.pdf.canvas.layout.image.image import Image
from borb.pdf.pdf import PDF

# NOTICE BELOW THE TYPE IS CONVERTED TO Path using pathlib
IMAGE_PATH = Path(r"C:\Users\...\image.png") #change to fit your path

def create_pdf (pdf_filename , outp_folder):
    os.makedirs(outp_folder, exist_ok=True)
    pdf_filepath = os.path.join(outp_folder, pdf_filename + ".pdf")
    pdf = Document()
    page = Page()
    pdf.add_page(page)
    page_layout = SingleColumnLayout(page)
    page_layout.vertical_margin = page.get_page_info().get_height() *     Decimal(0.02)
    page_layout.add(
         Image(image=IMAGE_PATH, width=100, height=100)) #change the size as you wish
    LayoutElement = Image
    with open(pdf_filepath, "wb") as pdf_file_handle:
        PDF.dumps(pdf_file_handle, pdf)


if __name__ == "__main__":
    ##### DECLARE CONSTANTS FOR THE TEST CODE
    TEST_FILE_NAME = "your_file_name.pdf" #here would go the name of your pdf file
    TEST_OUTP_FOLDER = "your_output_folder"
    create_pdf(pdf_filename = TEST_FILE_NAME, outp_folder = TEST_OUTP_FOLDER)
Вернуться на верх