我有一个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
,然后在浏览器中打开一个web控制台,您可以在一堆隐藏的input
标记中看到一个带有".tif“URL的form
标记。
发布于 2020-11-14 01:59:58
当涉及到转换TIFF和PNG文件时,img2pdf有一些奇怪之处。代码解决了代码中的一些潜在问题,因为它使用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文件,上面的代码正在获得。
发布于 2020-11-13 23:13:33
您是否试图从多个单页pdf中创建多页pdf?我相信你使用join()是不正确的。
请看本教程。几岁但肯定仍然有效:
https://www.blog.pythonlibrary.org/2018/04/11/splitting-and-merging-pdfs-with-python/
https://stackoverflow.com/questions/64762813
复制相似问题