Как добавить изображения в файл 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)