Как использовать AWS lambda для преобразования файлов PDF в .txt с помощью Python

Мне нужно автоматизировать преобразование многих pdf в текстовые файлы с помощью AWS lambda в python 3.7.

Я успешно конвертировал pdf-файлы с помощью poppler/pdftotext, tika и PyPDF2 на своей машине. Однако время ожидания истекло или ему нужно запустить экземпляр Java на хост-компьютере, который я не знаю, как настроить. pdftotext нуждается в poppler, и все решения для его запуска на лямбде кажутся устаревшими, или я просто недостаточно знаком с двоичными файлами, чтобы понять это решение. PyPDF2 кажется наиболее многообещающим, но тестирование выдает ошибку.

Код и ошибка, которые я получаю для PyPDF2, следующие:

pdf_file = open(s3.Bucket(my_bucket).download_file('test.pdf','test.pdf'),'rb')

  "errorMessage": "[Errno 30] Read-only file system: 'test.pdf.3F925aC8'",
  "errorType": "OSError",



and if I try to reference it directly,
pdf_file = open('https://s3.amazonaws.com/' + my_bucket + '/test.pdf', 'rb')

  "errorMessage": "[Errno 2] No such file or directory: 'https://s3.amazonaws.com/my_bucket/test.pdf'",
  "errorType": "FileNotFoundError",

person Texasitze    schedule 27.06.2019    source источник
comment
Дали ли вы своей роли выполнения Lambda права доступа к корзине S3?   -  person Michael Quale    schedule 27.06.2019
comment
Да, он имеет полные права чтения/записи s3   -  person Texasitze    schedule 27.06.2019


Ответы (2)


AWS lambda позволяет вам писать только в папку /tmp, поэтому вы должны скачать файл и поместить его туда.

person Stradivari    schedule 27.06.2019
comment
Вот чего мне не хватало! Спасибо - person Texasitze; 27.06.2019

Как указано в ошибке, вы пытаетесь записать в файловую систему, доступную только для чтения. Вы используете метод download_file, который пытается сохранить файл в «test.pdf», но это не удается. Попробуйте использовать download_fileobj (ссылка) вместе с буфером в памяти (например, io.BytesIO). Затем передайте этот поток в PyPDF2.

Пример:

import io
[...]

pdf_stream = io.StringIO()
object.download_fileobj(pdf_stream)
pdf_obj = PdfFileReader(pdf_stream)

[...]
person hnzlmnn    schedule 27.06.2019