You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

问题原因

  1. 无限循环导致超时:处理每页链接时,将links赋值为当前页的链接列表,接着遍历links时又执行links.append(link['uri']),不断向列表添加新元素,导致循环永远无法结束,函数卡死引发请求超时。
  2. 文本仅保留最后一页: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:51:19