удаление однотипных изображений из файла pdf
Имеется 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)
Источник: Stack Overflow на русском