如何在Python或ASP.NET Core中提取带格式布局的PDF文本
保留PDF文本格式的提取方案推荐
我在Python和ASP.NET Core中使用iTextSharp、PDFSharp、PyPDF2等库提取PDF文本时,能成功获取内容,但无法保留原有的间距、对齐等格式布局。试过PyMuPDF和Camelot,结果未达预期,现寻求可准确提取PDF文本并保留原格式布局的方案、库或代码片段,确保提取的文本还原PDF的间距、对齐及整体视觉结构。
当前提取结果
Invoice# Invoice Date Terms Due Date: INV-000003 : 18 May 2023 : Due on Receipt : 18 May 2023 Bill To Ship To Ms. Mary D. Dunton 1324 Hinkle Lake Road 1324 Hinkle Lake Road Needham Needham 02192 Maine 02192 Maine # Item & Description Qty Rate Amount 1 Camera DSLR camera with advanced shooting capabilities1 $899.00 $899.00 2 Fitness Tracker Activity tracker with heart rate monitoring1 $129.00 $129.00 3 Laptop Lightweight laptop with a powerful processor1 $1,199.00 $1,199.00 $2,227.00 5.00% $2,338.35 Thanks for shopping with us. $2,338.35Zylker Electronics Hub 14B, Northern Street Greater South Avenue New York New York 10001 U.S.A Sub Total Balance DueINVOICE TotalTax Rate
预期格式结果
Zylker Electronics Hub 14B, Northern Street Greater South Avenue New York New York 10001 U.S.A INVOICE Invoice# : INV-000003 Invoice Date : 18 May 2023 Terms : Due on Due Date Receipt : 18 May 2023 Bill To Ship To Ms. Mary D. Dunton 1324 Hinkle Lake Road 1324 Hinkle Lake Road Needham Needham 02192 Maine 02192 Maine # Item & Description Qty Rate 1 Camera 1 $899.00 DSLR camera with advanced shooting capabilities 2 Fitness Tracker 1 $129.00 Activity tracker with heart rate monitoring 3 Laptop 1 $1,199.00 Lightweight laptop with a powerful processor Sub Total $2,338.35 Tax Rate 5.00% Total $2,338.35 Thanks for shopping with us.
推荐方案
Python 环境
- PDFplumber:精准获取文本的坐标、字体、间距等布局信息,通过
layout=True参数可直接还原大部分排版结构,尤其适合表格类文档。
代码片段:import pdfplumber with pdfplumber.open("invoice.pdf") as pdf: page = pdf.pages[0] # 保留布局提取文本 formatted_text = page.extract_text(layout=True) print(formatted_text) - Tabula-py:针对表格密集的PDF(如发票),可识别表格结构并输出带格式的文本或DataFrame,能较好保留列对齐和间距。
ASP.NET Core 环境
- PdfPig:可获取每个字符/单词的精确坐标信息,通过坐标计算实现自定义排版,还原原文档的对齐和间距。
代码片段:using UglyToad.PdfPig; using UglyToad.PdfPig.Content; using (var document = PdfDocument.Open("invoice.pdf")) { var page = document.GetPage(1); // 按行分组并根据X坐标排序,模拟原对齐 var lines = page.GetWords().GroupBy(w => w.BoundingBox.Top); foreach (var line in lines.OrderByDescending(l => l.Key)) { var sortedWords = line.OrderBy(w => w.BoundingBox.Left); Console.WriteLine(string.Join(" ", sortedWords.Select(w => w.Text))); } } - iText 7:替代旧版iTextSharp,提供更强大的文本提取API,可自定义
LocationTextExtractionStrategy来保留布局格式。
补充说明
如果PDF是扫描件,需先通过Tesseract完成OCR识别文本,再结合上述库处理格式还原。
内容的提问来源于stack exchange,提问作者Adnan ali
相关产品推荐
相关产品推荐

