如何解决如何使用 Python 在谷歌云存储中拆分 PDF
我有一个 PDF,我想为其每个页面创建不同的 PDF。如果不在本地下载任何东西,我怎么能这样做?我知道 Document AI 有一个文件拆分模块(它实际上可以识别不同的文件......这是最理想的),但它不是公开可用的。
我目前正在使用 PyPDF2 来执行此操作
list_of_blobs = list(bucket.list_blobs(prefix = 'tmp/'))
print(len(list_of_blobs))
list_of_blobs[1].download_to_filename('/' + list_of_blobs[1].name)
inputpdf = PdfFileReader(open('/' + list_of_blobs[1].name,"rb"))
individual_files = []
stream = io.StringIO()
for i in range(inputpdf.numPages):
output = PdfFileWriter()
output.addPage(inputpdf.getPage(i))
individual_files.append(output)
with open("document-page%s.pdf" % (i + 1),"a") as outputStream:
outputStream.write(stream.getvalue())
#print(outputStream.read())
with open(outputStream.name,'rb') as f:
data = f.seek(85)
data = f.read()
individual_files.append(data)
bucket.blob('processed/' + "doc%s.pdf" % (i + 1)).upload_from_string(data,content_type='application/pdf')
在输出中,我看到不同的 PyPDF2 对象,例如
<PyPDF2.pdf.PdfFileWriter object at 0x12a2037f0>
但我不知道接下来应该如何进行。如果其他库效果更好,我也愿意使用其他库。
解决方法
我的程序无法运行的原因有两个:
- 我试图以追加模式读取文件(我通过将第二个
with(open)
块移到第一个块之外来修复此问题, - 我应该一直在写字节(我通过将打开模式更改为“wb”而不是“a”来解决此问题)
以下是更正后的代码:
if inputpdf.numPages > 2:
for i in range(inputpdf.numPages):
output = PdfFileWriter()
output.addPage(inputpdf.getPage(i))
with open("/tmp/document-page%s.pdf" % (i + 1),"wb") as outputStream:
output.write(outputStream)
with open(outputStream.name,'rb') as f:
data = f.seek(0)
data = f.read()
#print(data)
bucket.blob(prefix + '/processed/' + "page-%s.pdf" % (i + 1)).upload_from_string(data,content_type='application/pdf')
stream.truncate(0)
,
要将一个 PDF 文件拆分为多个小文件(页面),您需要为此下载数据。您可以将数据具体化到一个文件中(在可写目录 /tmp
中)或简单地将它们保存在内存中的 Python 变量中。
在这两种情况下:
- 数据将驻留在内存中
- 您需要获取数据才能执行 PDF 拆分。
如果你绝对想在流中读取数据(我不知道PDF格式是否可行!!),你可以使用streaming feature of GCS。但是,由于下载的数据没有 CRC,我不会向您推荐此解决方案,除非您准备好处理损坏的数据、重试和所有相关内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。