我有一个PDF,我想为它的每个页面创建不同的PDF。如果不在本地下载任何内容,我怎么能做到这一点?我知道Document AI有一个文件分割模块(它实际上可以识别不同的文件。这将是最理想的(,但这还没有公开。
我正在使用PyPDF2来完成这个curretly
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>
,但我不知道下一步该怎么做。
我的程序不工作有两个原因:
- 我试图在附加模式下读取一个文件(我通过将第二个CCD_
- 我应该一直在写字节(我通过将打开模式改为"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格式是否可行!!(,你可以使用GCS的流媒体功能。但是,因为下载的数据上没有CRC,我不建议你使用这个解决方案,除非你已经准备好处理损坏的数据、重试和所有相关的事情。
FYI,文档AI有一个主动监控的标签[cloud-document-ai]
Document AI Toolbox SDK已作为实验发布,它包括基于Document AI中拆分器/分类器处理器的输出拆分PDF文件的能力。
此文档页列出了支持的功能和代码示例。
https://cloud.google.com/document-ai/docs/handle-response#toolbox