如何使用 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,我不会推荐你这个解决方案,除非你准备好处理损坏的数据、重试和所有相关的东西。

我的程序无法运行的原因有两个:

  1. 我试图以追加模式读取文件(我通过将第二个 with(open) 块移动到第一个块之外来解决这个问题,
  2. 我应该一直在写字节(我通过将打开模式更改为 '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)