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

如何使用Dash Upload组件提取上传PDF中的文本?

解决Dash Upload提取PDF文本的问题

先搞懂base64.b64decode(content_string)的作用

  • Dash Upload组件上传文件时,会把文件的二进制内容编码成base64字符串——这是因为HTTP协议更适合传输文本格式数据,base64能把任意二进制数据(比如PDF的字节流)转换成可安全传输的ASCII字符串。
  • base64.b64decode()的作用就是把这个ASCII格式的编码字符串,还原回原始的二进制字节数据(也就是你上传的PDF文件的原始字节内容)。

为什么直接转utf-8会报错?

CSV、Excel的示例逻辑能直接转字符串,是因为CSV本身属于纯文本格式,Excel的读取逻辑也是调用专门库解析后提取文本。但PDF是结构化的二进制文档,里面包含字体、布局、压缩等非文本数据,直接把解码后的字节用utf-8解码成字符串,必然会遇到无法识别的字节,导致解码错误。

正确的实现步骤

你需要用专门的PDF文本提取库(比如PyPDF2或pdfplumber),读取解码后的二进制字节数据来提取文本,而不是直接转字符串。

完整代码示例

import dash
from dash import dcc, html, Input, Output, State
import base64
from io import BytesIO
# 选择PDF处理库,这里用PyPDF2为例,也可以换成pdfplumber
from PyPDF2 import PdfReader

app = dash.Dash(__name__)

app.layout = html.Div([
    dcc.Upload(
        id='upload-pdf',
        children=html.Div([
            '拖拽PDF文件到这里,或 ',
            html.A('选择文件')
        ]),
        style={
            'width': '100%',
            'height': '60px',
            'lineHeight': '60px',
            'borderWidth': '1px',
            'borderStyle': 'dashed',
            'borderRadius': '5px',
            'textAlign': 'center',
            'margin': '10px'
        },
        accept='.pdf'  # 限制仅上传PDF文件
    ),
    html.Div(id='output-pdf-text')
])

@app.callback(
    Output('output-pdf-text', 'children'),
    Input('upload-pdf', 'contents'),
    State('upload-pdf', 'filename'),
    prevent_initial_call=True
)
def extract_pdf_text(contents, filename):
    # 拆分上传内容:格式为"data:application/pdf;base64,xxxxxx"
    content_type, content_string = contents.split(',')
    
    # 解码base64字符串,得到PDF的二进制字节数据
    decoded_pdf = base64.b64decode(content_string)
    
    # 将二进制数据存入内存文件对象
    pdf_file = BytesIO(decoded_pdf)
    
    # 用PyPDF2读取并提取文本
    reader = PdfReader(pdf_file)
    text = ''
    for page in reader.pages:
        page_text = page.extract_text()
        if page_text:
            text += page_text + '\n\n'
    
    return html.Div([
        html.H4(f'已提取文件 {filename} 的文本内容:'),
        html.Pre(text, style={'whiteSpace': 'pre-wrap', 'wordBreak': 'break-all'})
    ])

if __name__ == '__main__':
    app.run_server(debug=True)

可选优化:用pdfplumber提升提取效果

如果PDF排版复杂(比如有表格、特殊字体),pdfplumber的文本提取效果更稳定,替换提取部分代码即可:

import pdfplumber
with pdfplumber.open(pdf_file) as pdf:
    text = ''
    for page in pdf.pages:
        text += page.extract_text() + '\n\n'

记得先安装依赖:pip install dash pdfplumber

内容的提问来源于stack exchange,提问作者Lucas Silva Costa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:50:08