Google AppEngineでPDFからテキストを抽出するには、pdfminerを使うと便利です。pdfminerは、ピュアPythonで書かれた、PDF解析ライブラリです。

ライブラリのインポートは、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の方がオススメです。