如何使用GAE中的转换API将文本转换为PDF?

时间:2012-04-25 20:20:05

标签: google-app-engine python-2.7

我正在处理一项任务,我想使用GAE中的转换API将文本文件转换为PDF文件,我试过:https://developers.google.com/appengine/docs/python/conversion/overview

这是我使用的代码:

from __future__ import with_statement
from google.appengine.api import files
import cgi, cgitb ; cgitb.enable()
import StringIO
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
import mimetypes
from google.appengine.ext import blobstore
from mimetypes import guess_type
from google.appengine.api import conversion




def mime_type(filename):
    return guess_type(filename)[0]
class get(webapp.RequestHandler):
    def post(self):

        form = cgi.FieldStorage() 
        file_upload = form['file']  
        name=file_upload.filename  

        m=mimetypes.guess_type(name)[0]

        data=file_upload.file.read()
        buf = StringIO.StringIO()
        asset = conversion.Asset("text/plain", data, file_upload.filename)
        conversion_obj = conversion.ConversionRequest(asset, "application/pdf")
        result = conversion.convert(conversion_obj)
        if result.assets:
             for asset in result.assets:
                buf.write(asset.data)

        else:
             print "ERROR" 


        u_file = files.blobstore.create(mime_type="application/pdf",_blobinfo_uploaded_filename="test.pdf")
        data=buf.getvalue()
        with files.open(u_file, 'a') as f:
            f.write(data)
        files.finalize(u_file)
        blob_key = files.blobstore.get_blob_key(u_file)
        blob_info = blobstore.get(blob_key)
        name2 =  blob_info.filename   
        self.response.out.write("""<html><br><body style="background-color:#CC9999"><b><font size="5" face="Batang" ><center> <li ><a href="download.py?blob_key=%s" style="color:black">%s

               </center></font><hr></body></html>            
                """ % (str(blob_key),str(name2)))




def main():

    application = webapp.WSGIApplication( [(r'/get.py', get)], debug=True)

    run_wsgi_app(application)


if __name__ == "__main__":
    main()

download.py:

from __future__ import with_statement
from google.appengine.ext import blobstore
from google.appengine.ext import webapp
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.ext.webapp.util import run_wsgi_app
from mimetypes import guess_type

def mime_type(filename):
    return guess_type(filename)[0]
class Thumbnailer(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self):
        blob_key = self.request.get("blob_key")
        if blob_key:
            blob_info = blobstore.get(blob_key)


            if blob_info:
                save_as1 =  blob_info.filename
                type2=mime_type(blob_info.filename)
                self.send_blob(blob_info,content_type=type2,save_as=save_as1)

                return


def main():


    application = webapp.WSGIApplication([
            (r'/download.*', Thumbnailer),
        ], debug=True)
    run_wsgi_app(application)



if __name__ == '__main__':
    main()

编辑:我编辑了代码,当我尝试print buf.getvalue()时,我得到:无法加载pdf文档。 但是当我尝试打开这个PDF时,我无法打开它,并且adobe reader会立即错误地提示它无法打开文件。对不起,我还是初学者,请帮忙吗?欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

这是我的工作代码示例(虽然它适用于Python2.7运行时)。祝你好运!


import os
import StringIO

from google.appengine.api import conversion
from google.appengine.api import files
from google.appengine.ext import blobstore
from google.appengine.ext import webapp
from google.appengine.ext.webapp import blobstore_handlers

import jinja2

template_dir = os.path.join(os.path.dirname(__file__), 'templates')

jinja2_env = jinja2.Environment(
    loader=jinja2.FileSystemLoader(template_dir))


class MainHandler(webapp.RequestHandler):
    def get(self):
        tmpl = jinja2_env.get_template('index.jinja2')
        self.response.out.write(tmpl.render())


class PostHandler(blobstore_handlers.BlobstoreDownloadHandler):
    def post(self):
        data = self.request.get('file')
        asset = conversion.Asset('text/plain', data, 'test.txt')
        conversion_obj = conversion.Conversion(asset, 'application/pdf')
        result = conversion.convert(conversion_obj)
        buf = StringIO.StringIO()
        if result.assets:
            for asset in result.assets:
                buf.write(asset.data)
        else:
            raise Exception('Conversion failed.')
        u_file = files.blobstore.create(mime_type='application/pdf',
                                        _blobinfo_uploaded_filename='test.pdf')
        with files.open(u_file, 'a') as f:
            f.write(buf.getvalue())
        files.finalize(u_file)
        blob_key = files.blobstore.get_blob_key(u_file)
        blob_info = blobstore.get(blob_key)
        self.send_blob(blob_info)


app = webapp.WSGIApplication([
    ('/', MainHandler),
    ('/post_file', PostHandler),
],
debug=True)

答案 1 :(得分:0)

您确定'数据'(由data=file_upload.file.read()检索)是否正确?

也许你可以停止使用cgi模块,只需使用webapp为你创建的请求对象:

data = self.request.get('file')

顺便说一句,请不要使用asset._data等私人属性,而是使用asset.data。另外,StringIO用于什么?您是否考虑过直接将asset.data写入已打开的文件?

更新:我想我找到了原因。

转换后,请按以下步骤操作:

if result.assets:
    for asset in result.assets
    buf.write(asset.data)