【问题标题】:flask RESTful service for pdfbox [closed]用于 pdfbox 的烧瓶 RESTful 服务 [关闭]
【发布时间】:2020-10-19 02:02:56
【问题描述】:
#!/usr/bin/env python3

import jpype
import jpype.imports
jpype.addClassPath(sys.argv[1])
jpype.startJVM(convertStrings=False)
import org.apache.pdfbox.tools as tools
tools.ExtractText.main(['-startPage', '1', sys.argv[2], sys.argv[3]])

我使用下面的python代码调用pdfbox。

$ ./main.py pdfbox-app-2.0.20.jar in.pdf output.txt

但是每次我想转换 pdf 文件时加载 jar 文件会很慢。任何人都可以提供烧瓶代码来制作 RESTful 服务,这样 pdfbox 只能加载一次,然后就可以从 PDF 中提取文本了吗?

PS。这个教程不适合解决我的问题。

https://flask.palletsprojects.com/en/1.1.x/patterns/fileuploads/

例如,它导入send_from_directory,这与完整的解决方案有点遥远。我需要的是一个示例程序,它可以从 REST 接口获取输入并将文件保存在某处,然后调用 java 代码,然后将文件发回。因此,需要一个显示所有三个步骤的示例。

【问题讨论】:

  • Flask 是要走的路,查看flask.palletsprojects.com/en/1.1.x/patterns/fileuploads 给出的示例。
  • Flask 是一种的方法。 Django、FastAPI、Pyramid 也是如此……这就是为什么要求我们查找或推荐场外资源的问题,以及主要基于意见的问题,都是明确的off-topic,如help center.
  • OP,这个问题太宽泛了。拥有 5k 的声誉,我怀疑你知道这一点。
  • 我只将问题限制在烧瓶中。请打开它。
  • @user1424739,这仍然是题外话。我们不是来为您编写(或查找)代码的。你对 Flask 做过一些基础研究吗?看过任何教程吗?找到了使用 Flask 创建 RESTful API 的库?

标签: python rest flask pdfbox


【解决方案1】:

您可以在 Flask 中创建一个 POST 路由,该路由将接收上传的 PDF 文件,使用 pdfbox 处理它并将您需要的任何内容返回给用户(文本内容或文本文件本身)。我没有测试这段代码,它只是一个了解想法的示例如何处理它,希望它会有所帮助!

"""
Pseudo-code with possible mistakes, not tested, just to get the idea...
"""
import gzip
from io import BytesIO

import jpype
import jpype.imports
import org.apache.pdfbox.tools as tools
from flask import Flask, make_response
from flask import request

UPLOAD_FOLDER = '/path/to/the/uploads'
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

jpype.addClassPath('pdfbox-app-2.0.20.jar')
jpype.startJVM(convertStrings=False)


def allowed_file(filename):
    """ Helper function to figure out if file is a-ok"""
    return '.' in filename and \
        filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


@app.route('/', methods=['POST'])
def index():
    """ Route to upload and process PDF files """
    uploaded_file_name = 'upload.pdf'
    converted_file = 'output.txt'

    # Get the file from the form upload (or any other desired way)
    # If you use curl with -F flag, request will contain 'form' data
    file_data = request.form['file']

    # Save content of file to local disk (e.g. save as .pdf file)
    with open(uploaded_file_name, 'w') as f:
        f.write(file_data)

    # Call your Java thingie
    try:
        tools.ExtractText.main(['-startPage', '1', uploaded_file_name, converted_file])
    except:
        print('Error processing file.')
        # Do extra post-processing if needed

    # Serve back whatever you need here...
    response = make_response(converted_file)
    gzip_buffer = BytesIO()
    gzip_file = gzip.GzipFile(mode='wb', fileobj=gzip_buffer)

    gzip_file.write(response.get_data())
    gzip_file.close()
    response.set_data(gzip_buffer.getvalue())
    response.headers.set('Content-Encoding', 'gzip')
    response.headers.set('Content-Length', len(response.get_data()))
    response.headers.set('Content-Disposition', 'attachment', filename=converted_file)
    return response

【讨论】:

  • 我是唯一使用服务器的人,因此不需要检查文件名。需要的是当调用jar函数出错时,应该有一些后处理代码。此外,它不应要求用户将文件名与文件内容一起发送,而应仅发送文件内容。换句话说,应该使用curl -v -F file='<'1.txt ... 而不是curl -v -F file=@1.txt ... 来查询服务器。返回的结果应该被压缩以节省网络带宽。最后,您能否测试一下您的代码以确保其正常工作?谢谢。
  • @user1424739 我更新了我的答案以更多地反映您的要求,但是,代码仍然未经测试,我无意测试它,首先因为重点不是获得完整的解决方案,这就是某些人真正得到报酬的原因。另一件事是,我不知道您要向 Web 服务器发送什么样的数据,以及您究竟需要做什么并返回。使用我的 sn-p,您应该有一个很好的起点,并且在 Flask docs(或 StakcOverflow)的帮助下,您应该能够自己完成其余的事情。
  • 您在服务器端使用了固定文件名。如果有对服务器的并发访问怎么办?应该返回什么来代替# Do extra post-processing if needed
  • 我使用了固定文件名,因为这是一个伪代码(如我的答案和代码 sn-p 中所述),而且我无意为您编写完全可操作的 Web 服务器。您应该能够自己弄清楚一些简单的事情。关于“额外处理”,我不知道您的意图是什么,您提到如果调用 Java 失败,您需要一些“额外的后处理”,所以只需处理它并返回您需要的任何内容(可能是某种错误? )...
  • +10 @errata 对于甚至模拟伪代码,对于一个明确的“给我答案”类型的问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多