Saya memiliki satu PDF yang ingin saya buat PDF berbeda untuk setiap halamannya. Bagaimana saya bisa melakukannya tanpa mengunduh apa pun secara lokal? Saya tahu bahwa Document AI memiliki modul pemisahan file (yang sebenarnya akan mengidentifikasi file yang berbeda .. yang paling ideal) tetapi itu tidak tersedia untuk umum.

Saya menggunakan PyPDF2 untuk melakukan ini sekarang

    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')

Dalam output, saya melihat objek PyPDF2 yang berbeda seperti <PyPDF2.pdf.PdfFileWriter object at 0x12a2037f0> tapi saya tidak tahu bagaimana saya harus melanjutkan selanjutnya. Saya juga terbuka untuk menggunakan perpustakaan lain jika itu berfungsi lebih baik.

0
saladass4254 14 Mei 2021, 05:32

2 jawaban

Jawaban Terbaik

Ada dua alasan mengapa program saya tidak berfungsi:

  1. Saya mencoba membaca file dalam mode append (saya memperbaikinya dengan memindahkan blok with(open) kedua di luar yang pertama,
  2. Saya seharusnya menulis byte (saya memperbaikinya dengan mengubah mode terbuka ke 'wb' alih-alih 'a')

Di bawah ini adalah kode yang diperbaiki:

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)
1
saladass4254 18 Mei 2021, 16:55

Untuk membagi file PDF menjadi beberapa file kecil (halaman), Anda perlu mengunduh data untuk itu. Anda dapat mewujudkan data dalam file (dalam direktori yang dapat ditulis /tmp) atau menyimpannya di memori dalam variabel python.

Dalam kedua kasus:

  • Data akan berada di memori
  • Anda perlu mendapatkan data untuk melakukan pemisahan PDF.

Jika Anda benar-benar ingin membaca data dalam streaming (saya tidak tahu apakah itu mungkin dengan format PDF!!), Anda dapat menggunakan fitur streaming GCS. Tetapi, karena tidak ada CRC pada data yang diunduh, saya tidak akan merekomendasikan Anda solusi ini, kecuali jika Anda siap menangani data yang rusak, percobaan ulang, dan semua hal terkait.

1
guillaume blaquiere 14 Mei 2021, 13:42