如何使用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
相关产品推荐
相关产品推荐

