通过循环读取从 TIFF 文件转换的一堆 PDF

Combine a bunch of PDFs converted from TIFF files as they're read in thru a loop

我有一个 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=23543456&pg_num=1,然后在你的浏览器中打开一个网络开发控制台,你可以看到一个 form 标签和一堆隐藏的“.tif”URL input 个标签。

您是否正在尝试从多个单页 PDF 中创建一个多页 PDF?我确定您对 join() 的使用不正确。

看看这个教程。几岁了,但肯定仍然有效:

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

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 之后,我确定完成您的任务的最佳方法是走另一条路。根据您的用例,您需要从所有隐藏的 TIFF 文件生成的 PDF 文件。源网站将生成 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=23543456&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 文件。