Объединить кучу PDF-файлов, преобразованных из файлов TIFF, по мере их чтения через цикл

#python #python-3.x #pdf #tiff

#python #python-3.x #PDF #tiff

Вопрос:

У меня есть веб-скребок Python, который просматривает кучу страниц TIFF в Интернете и преобразует каждую в PDF, но я не могу понять, как объединить все преобразованные PDF-файлы в один и записать его на свой компьютер.

 import img2pdf, requests
outPDF = []

for pgNum in range(1,20):
    tiff = requests.get("http://url-to-tiff-file.com/page=" str(pgNum)).content
    pdf = img2pdf.convert(tiff)
    outPDF.append(pdf)

with open("file","wb") as f:
    f.write(''.join(outPDF))
  

При запуске я получаю следующую ошибку:

 f.write(''.join(outPDF))
TypeError: sequence item 0: expected str instance, bytes found
  

Обновить

Если вы перейдете http://oris.co.palm-beach.fl.us/or_web1/details_img.asp?doc_id=23543456amp;pg_num=1 , а затем откроете консоль веб-разработки в своем браузере, вы увидите form тег с кучей URL-адресов «.tif» в куче скрытых input тегов.

Комментарии:

1. Вы пробовали мой код для загрузки ваших PDF-файлов?

Ответ №1:

img2pdf имеет некоторые особенности, когда дело доходит до преобразования файлов TIFF и PNG. Код решает некоторые из потенциальных проблем в вашем коде, поскольку он использует Pillow для переформатирования файлов изображений для обработки с помощью img2pdf

 import img2pdf
from PIL import Image

image_list = []
test_images = ['image_01.tiff', 'image_02.tiff', 'image_03.tiff']
for image in test_images:
   im = Image.open(f'{image}').convert('RGB')
   im.save(f'mod_{image}')
   image_list.append(f'mod_{image}')

with open('test.pdf', 'wb') as f:
   letter = (img2pdf.in_to_pt(8.5), img2pdf.in_to_pt(11))
   layout = img2pdf.get_layout_fun(letter)
   f.write(img2pdf.convert(image_list, layout_fun=layout))
  

Я изменил ваш код, чтобы использовать мой код выше, но я не могу его протестировать, потому что я не знаю, какой веб-сайт вы запрашиваете. Поэтому, пожалуйста, дайте мне знать, если что-то выйдет из строя, и я устраню неполадки.

 import img2pdf
import requests
from PIL import Image
from io import BytesIO

outPDF = []

for pgNum in range(1,20):
   tiff = requests.get("http://url-to-tiff-file.com/page=" str(pgNum)).content
   im = Image.open(BytesIO(tiff).convert('RGB')
   im.save(tiff)
   outPDF.append(tiff)

with open("file.pdf","wb") as f:
   letter = (img2pdf.in_to_pt(8.5), img2pdf.in_to_pt(11))
   layout = img2pdf.get_layout_fun(letter)
   f.write(img2pdf.convert(outPDF, layout_fun=layout))
  

ОБНОВЛЕННЫЙ ОТВЕТ

После того, как вы указали фактический URL-адрес целевого веб-сайта, я решил, что лучший способ выполнить вашу задачу — пойти другим путем. В зависимости от вашего варианта использования вы хотели, чтобы PDF-файл создавался из всех скрытых файлов TIFF. Исходный веб-сайт сгенерирует PDF-файл без загрузки всех этих файлов TIFF.

Вот код для получения этого сгенерированного PDF-файла и загрузки его в вашу систему.

 import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

capabilities = DesiredCapabilities().CHROME

chrome_options = Options()
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-infobars")
chrome_options.add_argument("start-maximized")
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--disable-popup-blocking")

download_directory = os.path.abspath('chrome_pdf_downloads')

prefs = {"download.default_directory": download_directory,
     "download.prompt_for_download": False,
     "download.directory_upgrade": True,
     "plugins.always_open_pdf_externally": True}

chrome_options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome('/usr/local/bin/chromedriver', options=chrome_options)

url_main = 'http://oris.co.palm-beach.fl.us/or_web1/details_img.asp? doc_id=23543456amp;pg_num=1'

driver.get(url_main)
WebDriverWait(driver, 60)
driver.find_element_by_xpath("//input[@name='button' and @onclick='javascript:ValidateAndSubmit(this.form)']").submit()
  

Если вы все еще хотите получить файлы TIFF, пожалуйста, дайте мне знать, и я рассмотрю возможность их загрузки и обработки для создания файла PDF, который получает приведенный выше код.

Комментарии:

1. в строке im = Image.open(tiff).convert('RGB') я получаю эту ошибку: ValueError: embedded null byte

2. Я добавил BytesIO к этой строке. Дайте мне знать, если это сработает.

3. Теперь он показывает эту ошибку: AttributeError: '_io.BytesIO' object has no attribute 'convert' . Возможно, URL-адрес имеет к этому какое-то отношение. Я обновлю свой вопрос с подробностями.

4. ваш URL выдает мне — «image_from_file.asp», а не tiff

5. Ваш URL-адрес также дал мне это — <div id=»header»><h1>Ошибка сервера </h1></div>

Ответ №2:

Вы пытаетесь создать многостраничный PDF-файл из нескольких одностраничных PDF-файлов? Я уверен, что ваше использование join() неверно.

Взгляните на это руководство. Пару лет, но, безусловно, все еще действует:

https://www.blog.pythonlibrary.org/2018/04/11/splitting-and-merging-pdfs-with-python/