Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 如何在GAE中使用转换API将文本转换为PDF?_Google App Engine_Python 2.7 - Fatal编程技术网

Google app engine 如何在GAE中使用转换API将文本转换为PDF?

Google app engine 如何在GAE中使用转换API将文本转换为PDF?,google-app-engine,python-2.7,Google App Engine,Python 2.7,我正在执行一项任务,我想使用GAE中的转换API将文本文件转换为PDF文件,我尝试了以下方式: 这是我使用的代码: 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.ex

我正在执行一项任务,我想使用GAE中的转换API将文本文件转换为PDF文件,我尝试了以下方式:

这是我使用的代码:

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()
编辑:我编辑了代码,当我试图
打印buf.getvalue()
时,我得到:加载pdf文档失败。
但当我试图打开这个PDF文件时,我无法打开它,adobe reader立即给出错误,它无法打开该文件。对不起,我还是初学者,有什么帮助吗?欢迎提供任何建议。

您确定您的“数据”(由
data=file\u upload.file.read()检索)是正确的吗

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

data = self.request.get('file')
顺便说一句,请不要使用私有属性,如
asset.\u data
,而是使用
asset.data
。另外,StringIO的用途是什么?您是否考虑过直接将
asset.data
写入打开的文件

更新:我想我找到了原因

转换后,请执行以下操作:

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

这是我的工作代码示例(不过是针对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)

我检查了从文件\u upload.file.read()返回的数据,结果是正确的,而且资产中没有作为公共数据的属性,只有私有数据,我使用StringIO存储结果,然后将此缓冲区存储到GAE中的blobstore中。我更新了答案。在原始代码中,将原始文本数据写入缓冲区。请使用result.assets中的数据。什么类型的问题?你能解释一下你的问题吗?例如,如何下载blob文件?从你的原始帖子中不清楚。你的下载处理程序(download.py?)在哪里?Takashi Matsuo:download.py处理程序工作正常,我在另一个应用程序中测试了它,当我尝试在屏幕上打印buf.getvalue()时,o/p无法加载pdf文档?Takashi Matsuo:我得到了**没有名为jinja2的模块**???:非常感谢你的帮助,错误是我写了**conversion\u obj=conversion.ConversionRequest(资产,“应用程序/pdf”)**而不是conversion.conversion,我在本地没有请求的情况下尝试了转换,这导致了错误,所以我用请求编写了转换,但当我部署它时(在线检查而不是本地检查),我没有收到错误,我不知道为什么?不过问题解决了谢谢你的帮助。很高兴听到这个消息。对不起,我没能早点指出。无论如何,祝你好运,编码愉快:):没问题,问题最终解决了,谢谢你的回复。

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)