【问题标题】:How to convert from text to PDF using conversion API in GAE?如何使用 GAE 中的转换 API 将文本转换为 PDF?
【发布时间】:2012-04-27 01:01:43
【问题描述】:

我正在处理一项任务,我想使用 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()

下载.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 阅读器立即给出错误,它无法打开文件。对不起,我还是初学者,有什么帮助吗?欢迎提出任何建议。

【问题讨论】:

    标签: google-app-engine python-2.7


    【解决方案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)
    

    【讨论】:

    • Takashi Matsuo:我知道了**No module named jinja2 **??
    • :非常感谢您的帮助,错误是我写了** conversion_obj = conversion.ConversionRequest(asset, "application/pdf") ** 而不是conversion.Conversion,我尝试在本地没有请求并且这给出了错误,所以我用请求写了它但是当我部署它时(不是在本地在线检查)我没有收到那个错误,我不知道为什么?但是问题已经解决了谢谢你的帮助。
    • 很高兴听到这个消息。抱歉我没能早点指出。无论如何,祝你好运,编码愉快:)
    • :没问题,问题终于解决了,谢谢您的回复。
    【解决方案2】:

    您确定您的“数据”(由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)
    

    【讨论】:

    • 我检查了从 file_upload.file.read() 返回的数据,它是正确的,资产中也没有属性,因为公共数据只是私有数据,我使用了 StringIO存储结果,然后将此缓冲区存储到 GAE 中的 blobstore 中。
    • 我更新了我的答案。在您的原始代码中,您将原始文本数据写入缓冲区。请使用 result.assets 中的数据。
    • 什么问题?你能试着解释你的问题吗?例如,如何下载 blob 文件?从您的原始帖子中不清楚。
    • 您的下载处理程序(download.py?)在哪里?
    • Takashi Matsuo:download.py 处理程序工作正常,我在另一个应用程序中对其进行了测试,这里当我尝试在屏幕上打印 buf.getvalue() 时,o/ p 加载pdf文件失败?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多