удаление однотипных изображений из файла pdf

Рейтинг: -1Ответов: 1Опубликовано: 17.05.2023

Имеется pdf файл, на каждой странице которого имеется одно и то же изображение. Возможно ли при помощи Python удалить только эти однотипные изображения, оставив все остальные объекты?

Вот мой пример кода:

from PyPDF2 import PdfFileWriter, PdfFileReader

#открываю исходный файл изображения в двоичном виде
my_img = open(r"const_file.PNG", 'rb')

#открываю исходный pdf-файл в двоичном виде и место под окончательный файл
inputStream = open("source.pdf", "rb")
outputStream = open("without_image.pdf", "wb")

#делаю объект-читалку pdf и объект для записи
src = PdfFileReader(inputStream)
output = PdfFileWriter()

#закидываем все объекты со всех страниц исходного файла в объект для записи
for i in range(src.getNumPages()):
    output.addPage(src.getPage(i))

#превращаю объект для записи в двоичный вид
output1 = bytearray(output)
#заменяю одну последовательность байтов, соответствующих картинке, на пустое место
output1.replace(my_sign, b'')
#записываю готовый pdf
output1.write(outputStream)

Однако, при этом появляется ошибка TypeError: cannot convert 'PdfFileWriter' object to bytearray.

Спрашивал у чата you-com, он приводит следующий образец кода, который не сработал:

import PyPDF2

input_file = "input.pdf"
output_file = "output.pdf"
max_size = 500

with open(input_file, "rb") as f_in, open(output_file, "wb") as f_out:
    pdf_reader = PyPDF2.PdfFileReader(f_in)
    pdf_writer = PyPDF2.PdfFileWriter()

    for i in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(i)
        new_page = PyPDF2.pdf.PageObject.createBlankPage(pdf_writer, page.mediaBox.getWidth(), page.mediaBox.getHeight())
        
        # iterate over the page's content objects and merge into new page
        content_object = page["/Contents"].getObject()
        if not isinstance(content_object, PyPDF2.pdf.ArrayObject):
            content_object = [content_object]
        for obj in content_object:
            if isinstance(obj, PyPDF2.pdf.XObject) and obj['/Subtype'] == '/Image' and obj["/Width"] < max_size and obj["/Height"] < max_size:
                continue
            new_page.mergePage(obj)

        pdf_writer.addPage(new_page)

    pdf_writer.write(f_out)

Ответы

▲ 0

Код работает, если нужно удалить однотипные изображения определенного размера. Для решения своей задачи я обращался именно к размерам изображения. Вот код:

import PyPDF2

pdf = PyPDF2.PdfFileReader('sample.pdf')

num_pages = pdf.getNumPages()

new_pdf = PyPDF2.PdfFileWriter()

for i in range(num_pages):
    page = pdf.getPage(i)
    images_lst = []
    for p in page['/Resources']['/XObject']:
        if page['/Resources']['/XObject'][p]['/Width'] < 500 and page['/Resources']['/XObject'][p]['/Height'] < 500:
            images_lst.append(p)
    for img in images_lst:
        del page['/Resources']['/XObject'][img]
    new_pdf.addPage(page)


with open('output.pdf', 'wb') as output:
    new_pdf.write(output)