Firebase Cloud Function成功提取数据但无法返回响应求助
Firebase云函数提取PDF文本和链接后响应超时问题
问题描述
开发Python版Firebase Cloud Function,用于提取指定URL中PDF文件的文本和链接。函数能正确提取数据(日志中可看到打印结果),但返回响应时无法得到预期结果,Postman会持续加载直至超时。
原代码
from firebase_functions import https_fn from firebase_admin import initialize_app import requests import fitz # PyMuPDF from io import BytesIO from firebase_functions import https_fn, options import flask initialize_app() app = flask.Flask(__name__) @app.post("/extract") def extract(): """ Extracts text from a PDF file and returns it as a JSON response. """ # Get the request data request_data = flask.request.get_json() # Check if the request data is valid if not request_data or 'url' not in request_data: return flask.jsonify({'error': 'Invalid request data'}), 400 # Get the URL of the PDF file pdf_url = request_data['url'] # Download the PDF file response = requests.get(pdf_url) pdf_bytes = response.content doc = fitz.open(stream=pdf_bytes, filetype="pdf") text = "" links = [] for page in doc: text = page.get_text() print(text) links = page.get_links() for link in links: if link.get('uri'): links.append(link['uri']) print(link) response_data = { 'text': text, 'links': links } print(response_data) # Return the extracted text as a JSON response_data return flask.jsonify(response_data), 200 @app.route('/__/health', methods=['GET']) def health_check(): return "OK", 200 @https_fn.on_request() def extractor(req: https_fn.Request) -> https_fn.Response: with app.request_context(req.environ): return app.full_dispatch_request()
问题原因
- 无限循环导致超时:处理每页链接时,将
links赋值为当前页的链接列表,接着遍历links时又执行links.append(link['uri']),不断向列表添加新元素,导致循环永远无法结束,函数卡死引发请求超时。 - 文本仅保留最后一页:
text = page.get_text()每次覆盖之前的文本,最终返回的只有PDF最后一页的内容,而非全部页面文本。
解决方案
修改链接处理逻辑,分离当前页链接列表与URI存储列表,避免无限循环;同时修改文本拼接方式,累加所有页面文本:
from firebase_functions import https_fn from firebase_admin import initialize_app import requests import fitz # PyMuPDF from io import BytesIO from firebase_functions import https_fn, options import flask initialize_app() app = flask.Flask(__name__) @app.post("/extract") def extract(): """ Extracts text from a PDF file and returns it as a JSON response. """ # Get the request data request_data = flask.request.get_json() # Check if the request data is valid if not request_data or 'url' not in request_data: return flask.jsonify({'error': 'Invalid request data'}), 400 # Get the URL of the PDF file pdf_url = request_data['url'] # Download the PDF file response = requests.get(pdf_url) pdf_bytes = response.content doc = fitz.open(stream=pdf_bytes, filetype="pdf") text = "" links = [] for page in doc: # 累加所有页面的文本 text += page.get_text() print(text) # 单独存储当前页的链接列表,避免修改遍历的列表 page_links = page.get_links() for link in page_links: if link.get('uri'): links.append(link['uri']) print(link) response_data = { 'text': text, 'links': links } print(response_data) # Return the extracted text as a JSON response_data return flask.jsonify(response_data), 200 @app.route('/__/health', methods=['GET']) def health_check(): return "OK", 200 @https_fn.on_request() def extractor(req: https_fn.Request) -> https_fn.Response: with app.request_context(req.environ): return app.full_dispatch_request()
说明
- 用
page_links单独存储当前页的原始链接数据,遍历该列表时向全局links添加URI,彻底避免无限循环。 - 文本使用
text += page.get_text()实现累加,确保返回PDF所有页面的完整文本。
内容的提问来源于stack exchange,提问作者sona ali
相关产品推荐
相关产品推荐

