Задать вопрос
@glu-dimaz

Как правильно конвертировать .pdf -> .png -> .pdf?

67ca56dfe21ec072677140.png
Данный шаблон в формате .pdf . В него будет необходимо вставлять буковки. Моя задача, переконвертировать его в .png, провести с ним ряд операций, сохранить как новое изображение, а после - конвертировать новое изображение обратно в .pdf

Конвертировать первый раз .pdf в .png в целом, можно 1 раз за все время, чтобы получить оригинал документа в виде картинки и далее уже исполнение будет без этой процедуры. Пытаюсь понять, как сохранять пропорции и не терять качество изображение.
pdf_document = fitz.open(pdf_path)
    for page_num in range(pdf_document.page_count):
        page = pdf_document[page_num]
        image = page.get_pixmap(matrix=fitz.Matrix(scale, scale))
        image_path = f"page_{page_num + 1}.png"
        image.save(image_path)
    pdf_document.close()

К примеру вот, при масштабе в 3.0 изображение имеет размер 2526 х 1786, С таким размером далее можно уже работать. Но после, как такое обработанное изображение преобразовать обратно в .pdf, чтобы сохранилось абсолютно точное положение на листе, с абсолютно такими же границами страницы.
doc = SimpleDocTemplate(pdf_path, pagesize=letter)
img = Img(png_path, width=letter[0], height=letter[1])
doc.build([img])

(Найти такой шаблон в ином формате - скорее сложнее чем найти решение данной задачи)
  • Вопрос задан
  • 245 просмотров
Подписаться 1 Простой 13 комментариев
Решения вопроса 1
@glu-dimaz Автор вопроса
def pdf_to_png(pdf_path, poppler_path, dpi=300):
    images = convert_from_path(pdf_path, dpi=dpi, poppler_path=poppler_path)
    image_paths = []
    
    for i, image in enumerate(images):
        image_path = f"page_{i+1}.png"
        image.save(image_path, "PNG")
        image_paths.append(image_path)
    
    return image_paths

def png_to_pdf(image_paths, output_pdf, dpi=300):
    pdf = None
    
    for image_path in image_paths:
        image = Image.open(image_path)
        width, height = image.size
        width_pt = width * 72 / dpi  
        height_pt = height * 72 / dpi
        
        if pdf is None:
            pdf = FPDF(unit="pt", format=[width_pt, height_pt])
        pdf.add_page()
        pdf.image(image_path, 0, 0, width_pt, height_pt)
    
    pdf.output(output_pdf, "F")

def convert_pdf_to_pdf(pdf_path, output_pdf, poppler_path, dpi=300):
    image_paths = pdf_to_png(pdf_path, poppler_path, dpi)
    png_to_pdf(image_paths, output_pdf, dpi)

pdf_path = "form.pdf"  # Path to the input PDF
output_pdf = "output.pdf"  # Path to the final PDF
poppler_path = r"C:\\poppler-24.08.0\\Library\\bin" 

convert_pdf_to_pdf(pdf_path, output_pdf, poppler_path)
print("Conversion complete!")
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
402d
@402d
начинал с бейсика на УКНЦ в 1988
https://pypi.org/search/?q=pdf+to+png
А вот в PDF можно и упростить.
Если цель в том, чтобы файлик было не только посмотреть, но и распечатать сразу на принтере,
то собирать его в PCLm / mPDF - упрощенный формат.
Картинка режется на полосы. Большинство принтеров переварят их по 32 точке в высоту.
За основу берем 150 дпи и нужный формат бумаги. Ресайзим
открывается документ
%PDF-1.3
%PCLm 1.0

Начинается страница
Пробегаем по картинке собирая по отдельности три части описывающие станицу
1 Ее размеры и ссылка на содержимое
2. Содержание, что она из кучи картинок
3. Поток с байтами для картинок

Закрывается документ служебными элементами PDF

Выглядит сложно. А на практике, Сравнив парочку prn файлов сразу поймете, что там меняется

Если с принтерами не заморачиваться, то там все упрощается.
Байты, это PDF в котором одна страница - на ней одна картинка - картинка вот ее содержание
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы