#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/