如何使用 Python 在 google 云存储中拆分 PDF
How do I split a PDF in google cloud storage using Python
我有一个 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>
但我不知道下一步该怎么做。如果效果更好,我也愿意使用其他库。
要将一个PDF文件分割成几个小文件(页面),您需要为此下载数据。您可以将数据具体化在一个文件中(在可写目录 /tmp
中)或简单地将它们保存在内存中的 python 变量中。
在这两种情况下:
- 数据将驻留在内存中
- 您需要获取数据才能执行 PDF 拆分。
如果你绝对想在流中读取数据(我不知道 PDF 格式是否可行!!),你可以使用 streaming feature of GCS。但是,因为下载的数据没有 CRC,我不会推荐你这个解决方案,除非你准备好处理损坏的数据、重试和所有相关的东西。
我的程序无法运行的原因有两个:
- 我试图以追加模式读取文件(我通过将第二个
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,我想为其每个页面创建不同的 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>
但我不知道下一步该怎么做。如果效果更好,我也愿意使用其他库。
要将一个PDF文件分割成几个小文件(页面),您需要为此下载数据。您可以将数据具体化在一个文件中(在可写目录 /tmp
中)或简单地将它们保存在内存中的 python 变量中。
在这两种情况下:
- 数据将驻留在内存中
- 您需要获取数据才能执行 PDF 拆分。
如果你绝对想在流中读取数据(我不知道 PDF 格式是否可行!!),你可以使用 streaming feature of GCS。但是,因为下载的数据没有 CRC,我不会推荐你这个解决方案,除非你准备好处理损坏的数据、重试和所有相关的东西。
我的程序无法运行的原因有两个:
- 我试图以追加模式读取文件(我通过将第二个
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)