Google AppEngineでPDFからテキストを抽出するには、pdfminerを使うと便利です。pdfminerは、ピュアPythonで書かれた、PDF解析ライブラリです。
ライブラリのインポートは、GitHubのpdfminerのリポジトリからpdfminerフォルダをAppEngineのプロジェクトフォルダにコピーするだけです。以降、以下のようなコードでテキスト抽出を行うことができます。get_pdf_textの引数のcontentはPDFのBlobです。
ただし、認識できなかった文字コードは(cid:xxx)のようなテキストが返ってくるので、見栄えが気になる場合は適当にgrepしてやる必要があります。また、process_pdfに大きなPDFを与えると、AppEngineのスモールインスタンスではメモリが不足するので、ページ数は適当に制約をかける必要があるかと思います。
他、ピュアPythonのPDF解析ライブラリとして、pypdf2もありますが、日本語のPDFがうまく解析できなかったので、pdfminerの方がオススメです。
ライブラリのインポートは、GitHubのpdfminerのリポジトリからpdfminerフォルダをAppEngineのプロジェクトフォルダにコピーするだけです。以降、以下のようなコードでテキスト抽出を行うことができます。get_pdf_textの引数のcontentはPDFのBlobです。
from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfinterp import PDFResourceManager from pdfminer.pdfinterp import PDFPageInterpreter from pdfminer.pdfpage import PDFPage from io import BytesIO from StringIO import StringIO def process_pdf(rsrcmgr, device, fp, pagenos=None, maxpages=0, password='', caching=True, check_extractable=True): interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=check_extractable): interpreter.process_page(page) def get_pdf_text(content): rsrcmgr = PDFResourceManager() retstr = StringIO() codec = 'utf-8' laparams = LAParams() device = TextConverter(rsrcmgr, retstr, codec=codec) input_io = BytesIO(content) try: process_pdf(rsrcmgr, device, input_io, None , 8) #max 8 page except: return "" device.close() str = retstr.getvalue() retstr.close() self.text=db.Text(str, encoding="utf-8") return str
ただし、認識できなかった文字コードは(cid:xxx)のようなテキストが返ってくるので、見栄えが気になる場合は適当にgrepしてやる必要があります。また、process_pdfに大きなPDFを与えると、AppEngineのスモールインスタンスではメモリが不足するので、ページ数は適当に制約をかける必要があるかと思います。
他、ピュアPythonのPDF解析ライブラリとして、pypdf2もありますが、日本語のPDFがうまく解析できなかったので、pdfminerの方がオススメです。
コメント