Extrahera text från PDF-filer med PDFMiner i Python
Behärska PDF-textextraktion med Python
PDFMiner.six är en kraftfull Python-bibliotek för att extrahera text, metadata och layoutinformation från PDF-dokument.
Skiljer sig från enkla PDF-läsare, eftersom den ger djup analys av PDF-struktur och hanterar komplexa layouter effektivt.

Vad är PDFMiner och varför använda det?
PDFMiner är ett bibliotek i ren Python som är utformat för att extrahera och analysera text från PDF-dokument. Den .six versionen är den aktiva fork som stöder Python 3.x, medan det ursprungliga PDFMiner-projektet inte längre uppdateras.
Viktiga funktioner:
- Ren Python-implementering (ingen externa beroenden)
- Detaljerad layoutanalys och textpositionering
- Detektering av teckensnitt och karaktärskodning
- Stöd för krypterade PDF-filer
- Kommandoradsverktyg inkluderade
- Utökbar arkitektur för anpassad bearbetning
PDFMiner är särskilt användbart när du behöver exakt kontroll över textextrahering, behöver bevara layoutinformation eller arbetar med komplexa flera kolumns dokument. Även om det kan vara långsammare än vissa alternativ, gör dess noggrannhet och detaljerade analysförmåga det till det föredragna valet för dokumentbearbetningspipelines. För den omvända arbetsflödet kan du också vara intresserad av generera PDF:er programmerat i Python.
Installation och konfiguration
Installera PDFMiner.six med pip:
pip install pdfminer.six
För virtuella miljöer (rekommenderas):
python -m venv venv
source venv/bin/activate # På Windows: venv\Scripts\activate
pip install pdfminer.six
Om du är ny i Python-pakethantering, se vårt Python Cheat Sheet för mer information om pip och virtuella miljöer.
Verifiera installationen:
pdf2txt.py --version
Biblioteket innehåller flera kommandoradsverktyg:
pdf2txt.py- Extrahera text från PDF:erdumppdf.py- Dumpa PDF:s inre strukturlatin2ascii.py- Konvertera latinbokstäver till ASCII
Dessa verktyg kompletterar andra PDF-manipulationsverktyg som Poppler som ger ytterligare funktioner som sidor extrahering och formatkonvertering.
Grundläggande textextrahering
Enkel textextrahering
Den enklaste sättet att extrahera text från en PDF:
from pdfminer.high_level import extract_text
# Extrahera all text från en PDF
text = extract_text('document.pdf')
print(text)
Den här hög-nivå-API:et hanterar de flesta vanliga användningsscenarier och returnerar hela dokumentet som en enda sträng.
Extrahera text från specifika sidor
För att extrahera text från specifika sidor:
from pdfminer.high_level import extract_text
# Extrahera text från sidor 2-5 (0-indexerade)
text = extract_text('document.pdf', page_numbers=[1, 2, 3, 4])
print(text)
Detta är särskilt användbart för stora dokument där du bara behöver vissa avsnitt, vilket betydligt förbättrar prestandan.
Extrahera text med sidanavigering
För bearbetning av sidor individuellt:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
for page_layout in extract_pages('document.pdf'):
for element in page_layout:
if isinstance(element, LTTextContainer):
print(element.get_text())
Detta tillvägagångssätt ger dig mer kontroll över hur varje sida bearbetas, vilket är användbart när du arbetar med dokument där sidastrukturen varierar.
Avancerad layoutanalys
Förstå LAParams
LAParams (Layout Analysis Parameters) styr hur PDFMiner tolkar dokumentlayouten. Förståelsen av skillnaden mellan PDFMiner och enklare bibliotek är viktig här - PDFMiner analyserar faktiskt de spatiala förhållandena mellan textelementen.
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Skapa anpassade LAParams
laparams = LAParams(
line_overlap=0.5, # Minsta överskridande för textrader
char_margin=2.0, # Karaktärmarginal
line_margin=0.5, # Radmarginal
word_margin=0.1, # Ordavstånd
boxes_flow=0.5, # Boxflödesgräns
detect_vertical=True, # Upptäck vertikal text
all_texts=False # Extrahera endast text i boxar
)
text = extract_text('document.pdf', laparams=laparams)
Parametern förklaring:
line_overlap: Hur mycket rader måste överskrida varandra vertikalt för att betraktas som samma rad (0,0-1,0)char_margin: Maximalt avstånd mellan tecken i samma ord (som multipel av teckenbredd)line_margin: Maximalt avstånd mellan rader i samma styckeword_margin: Avståndsgränse för att separera ordboxes_flow: Gräns för textboxflödesriktningdetect_vertical: Aktivera upptäckt av vertikal text (vanligt i asiatiska språk)
Extrahera layoutinformation
Få detaljerad position och teckensnittsinformation:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextBox, LTTextLine, LTChar
for page_layout in extract_pages('document.pdf'):
for element in page_layout:
if isinstance(element, LTTextBox):
# Få bounding box-koordinater
x0, y0, x1, y1 = element.bbox
print(f"Text vid ({x0}, {y0}): {element.get_text()}")
# Iterera genom rader
for text_line in element:
if isinstance(text_line, LTTextLine):
# Få karaktärnivådetaljer
for char in text_line:
if isinstance(char, LTChar):
print(f"Tecken: {char.get_text()}, "
f"Teckensnitt: {char.fontname}, "
f"Storlek: {char.height}")
Den här detaljnivån är särskilt användbar för dokumentanalys, formuläruttag eller när du behöver förstå dokumentstruktur programmässigt.
Hantering av olika PDF-typer
Krypterade PDF:er
PDFMiner kan hantera lösenordsskyddade PDF:er:
from pdfminer.high_level import extract_text
# Extrahera från lösenordsskyddad PDF
text = extract_text('encrypted.pdf', password='your_password')
Notera att PDFMiner kan endast extrahera text från PDF:er - den kan inte undvika säkerhetsrestriktioner som förhindrar textextrahering på PDF-nivå.
Multi-kolumn dokument
För dokument med flera kolumner, justera LAParams:
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Optimera för multi-kolumn layout
laparams = LAParams(
detect_vertical=False,
line_margin=0.3,
word_margin=0.1,
boxes_flow=0.3 # Lägre värde för bättre kolumnupptäckt
)
text = extract_text('multi_column.pdf', laparams=laparams)
Parametern boxes_flow är särskilt viktig för multi-kolumn dokument - lägre värden hjälper PDFMiner att skilja mellan separata kolumner.
Inte-engelska och Unicode-text
PDFMiner hanterar Unicode bra, men se till att ha korrekt kodning:
from pdfminer.high_level import extract_text
# Extrahera text med Unicode-stöd
text = extract_text('multilingual.pdf', codec='utf-8')
# Spara till fil med UTF-8-kodning
with open('output.txt', 'w', encoding='utf-8') as f:
f.write(text)
Arbeta med skannade PDF:er
PDFMiner kan inte extrahera text direkt från skannade PDF:er (bilder). Dessa kräver OCR (Optisk teckenigenkänning). Du kan dock integrera PDFMiner med OCR-verktyg.
Här är hur du kan upptäcka om en PDF är skannad och behöver OCR:
from pdfminer.high_level import extract_text
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTFigure, LTImage
def is_scanned_pdf(pdf_path):
"""Kontrollera om PDF verkar vara skannad (främst bilder)"""
text_count = 0
image_count = 0
for page_layout in extract_pages(pdf_path):
for element in page_layout:
if isinstance(element, (LTFigure, LTImage)):
image_count += 1
elif hasattr(element, 'get_text'):
if element.get_text().strip():
text_count += 1
# Om främst bilder och lite text, sannolikt skannad
return image_count > text_count * 2
if is_scanned_pdf('document.pdf'):
print("Den här PDF:en verkar vara skannad - använd OCR")
else:
text = extract_text('document.pdf')
print(text)
För skannade PDF:er, överväg att integrera med Tesseract OCR eller använda verktyg för att extrahera bilder från PDF:er först, sedan tillämpa OCR på dessa bilder.
Kommandoradsanvändning
PDFMiner innehåller kraftfulla kommandoradsverktyg:
Extrahera text med kommandoradsverktyg
# Extrahera text till stdout
pdf2txt.py document.pdf
# Spara till fil
pdf2txt.py -o output.txt document.pdf
# Extrahera specifika sidor
pdf2txt.py -p 1,2,3 document.pdf
# Extrahera som HTML
pdf2txt.py -t html -o output.html document.pdf
Avancerade alternativ
# Anpassade layoutparametrar
pdf2txt.py -L 0.3 -W 0.1 document.pdf
# Extrahera med detaljerad layout (XML)
pdf2txt.py -t xml -o layout.xml document.pdf
# Ställ in lösenord för krypterad PDF
pdf2txt.py -P mypassword encrypted.pdf
Dessa kommandoradsverktyg är utmärkta för snabb testning, shellskript och integration i automatiserade arbetsflöden.
Prestandaoptimering
Bearbeta stora PDF:er
För stora dokument, överväg dessa optimeringsstrategier:
from pdfminer.high_level import extract_pages
from pdfminer.layout import LAParams
# Bearbeta endast nödvändiga sidor
def extract_page_range(pdf_path, start_page, end_page):
text_content = []
for i, page_layout in enumerate(extract_pages(pdf_path)):
if i < start_page:
continue
if i >= end_page:
break
text_content.append(page_layout)
return text_content
# Inaktivera layoutanalys för hastighet
from pdfminer.high_level import extract_text
text = extract_text('large.pdf', laparams=None) # Många snabbare
Batchbearbetning
För att effektivt bearbeta flera PDF:er:
from multiprocessing import Pool
from pdfminer.high_level import extract_text
import os
def process_pdf(pdf_path):
"""Bearbeta en enda PDF-fil"""
try:
text = extract_text(pdf_path)
output_path = pdf_path.replace('.pdf', '.txt')
with open(output_path, 'w', encoding='utf-8') as f:
f.write(text)
return f"Bearbetat: {pdf_path}"
except Exception as e:
return f"Fel vid bearbetning av {pdf_path}: {str(e)}"
# Bearbeta PDF:er parallellt
def batch_process_pdfs(pdf_directory, num_workers=4):
pdf_files = [os.path.join(pdf_directory, f)
for f in os.listdir(pdf_directory)
if f.endswith('.pdf')]
with Pool(num_workers) as pool:
results = pool.map(process_pdf, pdf_files)
for result in results:
print(result)
# Användning
batch_process_pdfs('/path/to/pdfs', num_workers=4)
Vanliga problem och lösningar
Problem: Felaktig textordning
Problem: Extraherad text verkar förvirrad eller i fel ordning.
Lösning: Justera LAParams, särskilt boxes_flow:
from pdfminer.layout import LAParams
laparams = LAParams(boxes_flow=0.3) # Försök olika värden
text = extract_text('document.pdf', laparams=laparams)
Problem: Saknade mellanslag mellan ord
Problem: Ord förenas utan mellanslag.
Lösning: Öka word_margin:
laparams = LAParams(word_margin=0.2) # Öka från standard 0,1
text = extract_text('document.pdf', laparams=laparams)
Problem: Kodningsfel
Problem: Strävna tecken eller kodningsfel.
Lösning: Specifika kodning explicit:
text = extract_text('document.pdf', codec='utf-8')
Problem: Minnesfel med stora PDF:er
Problem: Minnesfel med stora filer.
Lösning: Bearbeta sida för sida:
def extract_text_chunked(pdf_path, chunk_size=10):
"""Extrahera text i delar för att minska minnesanvändning"""
all_text = []
page_count = 0
for page_layout in extract_pages(pdf_path):
page_text = []
for element in page_layout:
if hasattr(element, 'get_text'):
page_text.append(element.get_text())
all_text.append(''.join(page_text))
page_count += 1
# Bearbeta i delar
if page_count % chunk_size == 0:
yield ''.join(all_text)
all_text = []
# Yield kvarvarande text
if all_text:
yield ''.join(all_text)
Jämförelse mellan PDFMiner och alternativ
Förstå när att använda PDFMiner jämfört med andra bibliotek är viktigt:
PDFMiner vs PyPDF2
PyPDF2 är enklare och snabbare men mindre noggrann:
- Använd PyPDF2 för: Enkla PDF:er, snabb extrahering, sammanfoga/splitta PDF:er
- Använd PDFMiner för: Komplexa layouter, exakt textpositionering, detaljerad analys
PDFMiner vs pdfplumber
pdfplumber bygger på PDFMiner med en högre nivå API:
- Använd pdfplumber för: Tabelluttag, enklare API, snabb prototypning
- Använd PDFMiner för: Maximal kontroll, anpassad bearbetning, produktionsystem
PDFMiner vs PyMuPDF (fitz)
PyMuPDF är betydligt snabbare men har C-beroenden:
- Använd PyMuPDF för: Prestandakritiska tillämpningar, storskalig bearbetning
- Använd PDFMiner för: Ren Python krav, detaljerad layoutanalys
Praktiskt exempel: Extrahera och analysera dokument
Här är ett komplett exempel som extraherar text och ger dokumentstatistiker:
from pdfminer.high_level import extract_pages, extract_text
from pdfminer.layout import LTTextBox, LTChar
from collections import Counter
import re
def analyze_pdf(pdf_path):
"""Extrahera text och ge dokumentanalys"""
# Extrahera full text
full_text = extract_text(pdf_path)
# Statistiker
stats = {
'total_chars': len(full_text),
'total_words': len(full_text.split()),
'total_lines': full_text.count('\n'),
'fonts': Counter(),
'font_sizes': Counter(),
'pages': 0
}
# Detaljerad analys
for page_layout in extract_pages(pdf_path):
stats['pages'] += 1
for element in page_layout:
if isinstance(element, LTTextBox):
for line in element:
for char in line:
if isinstance(char, LTChar):
stats['fonts'][char.fontname] += 1
stats['font_sizes'][round(char.height, 1)] += 1
return {
'text': full_text,
'stats': stats,
'most_common_font': stats['fonts'].most_common(1)[0] if stats['fonts'] else None,
'most_common_size': stats['font_sizes'].most_common(1)[0] if stats['font_sizes'] else None
}
# Användning
result = analyze_pdf('document.pdf')
print(f"Sidor: {result['stats']['pages']}")
print(f"Ord: {result['stats']['total_words']}")
print(f"Huvudteckensnitt: {result['most_common_font']}")
print(f"Huvudstorlek: {result['most_common_size']}")
Integration med dokumentbearbetningspipelines
PDFMiner fungerar bra i större dokumentbearbetningsarbetsflöden. Till exempel, när du bygger RAG (Retrieval-Augmented Generation) system eller dokumenthanteringssystem, kan du kombinera det med andra Pythonverktyg för en komplett pipeline.
När du har extraherat text från PDF:er, behöver du ofta konvertera den till andra format. Du kan konvertera HTML-innehåll till Markdown med Pythonbibliotek eller till och med använda LLM-driven konvertering med Ollama för intelligente dokumenttransformationer. Dessa tekniker är särskilt användbara när PDF-extrahering producerar HTML-liknande strukturerade text som behöver rensas och omformateras.
För omfattande dokumentkonverteringspipelines kan du också behöva hantera Worddokument till Markdownkonvertering, skapa en enhetlig arbetsflöde som bearbetar flera dokumentformat till ett gemensamt utdataformat.
Bästa praxis
-
Använd alltid LAParams för komplexa dokument - Standardinställningarna fungerar för enkla dokument, men justering av LAParams förbättrar resultatet avsevärt för komplexa layouter.
-
Testa med exempelsidor först - Innan du bearbetar stora batchar, testa dina extraheringsinställningar på representativa exempel.
-
Hantera undantag på ett snyftigt sätt - PDF-filer kan vara skadade eller felaktigt formaterade. Använd alltid try-except-block runt extraheringskod.
-
Cachera extraherad text - För upprepade bearbetningar, cachera extraherad text för att undvika ombearbetning.
-
Validera extraherad text - Implementera kontroller för att verifiera extraheringskvalitet (t.ex. minsta textlängd, förväntade nyckelord).
-
Överväg alternativ för specifika användningsfall - Även om PDFMiner är kraftfull, kan ibland specialiserade verktyg (t.ex. tabula-py för tabeller) vara mer lämpliga.
-
Håll PDFMiner uppdaterat - Den
.sixfork är aktivt underhållen. Håll den uppdaterad för felsökning och förbättringar. -
Dokumentera din kod korrekt - När du delar PDF-extraheringsskript, använd korrekt Markdown-kodblock med syntaxmarkering för bättre läsbarhet.
Slutsats
PDFMiner.six är en nödvändig verktyg för Pythonutvecklare som arbetar med PDF-dokument. Dess ren Python-implementering, detaljerade layoutanalys och utökbara arkitektur gör det idealiskt för produktionsdokumentbearbetningssystem. Även om det kan ha en stigare inlärningskurva än enklare bibliotek, är noggrannheten och kontrollen den erbjuder obetydliga för komplexa PDF-extraheringsuppgifter.
Vare sig du bygger ett dokumenthanteringssystem, analyserar vetenskapliga artiklar eller extraherar data för maskininlärningspipelines, erbjuder PDFMiner grunden för tillförlitlig PDF-textextrahering i Python.
Relaterade resurser
Relaterade artiklar på den här sidan
- PDF-manipuleringsverktyg i Ubuntu - Poppler - Komplett guide till kommandoradsverktyg för PDF:er inklusive pdftotext, pdfimages och andra popplerverktyg som fungerar tillsammans med PDFMiner i dokumentbearbetningsarbetsflöden
- Hur man extraherar bilder från PDF - Cheat Sheet - Lär dig hur man extraherar inbäddade bilder från PDF:er med popplers kommandoradsverktyg, kompletterande PDFMiners textextraheringsförmåga
- Generera PDF i Python - Bibliotek och exempel - Utforska Pythonbibliotek för PDF-generering inklusive ReportLab, PyPDF2 och FPDF för att skapa den omvända arbetsflödet av PDF-textextrahering
- Python Cheat Sheet - Essentiell Python-syntaxreferens inklusive filhantering, strängoperationer och bästa praxis för att skriva rena PDF-bearbetningsskript
- Konvertera HTML till Markdown med Python: En omfattande guide - När du bygger dokumentkonverteringspipelines, lär dig hur du konverterar HTML (extraherat från PDF:er eller webben) till Markdown-format med Pythonbibliotek
- Konvertera HTML-innehåll till Markdown med LLM och Ollama - Avancerad teknik med lokala LLM:er för att intelligently konvertera HTML-innehåll till Markdown, användbar för att rensa extraherad PDF-text
- Använda Markdown-kodblock - Mästare Markdown-syntax för att dokumentera din PDF-extraheringskod med korrekt formatering och syntaxmarkering
- Konvertera Worddokument till Markdown: En komplett guide - Komplett dokumentkonverteringsguide inklusive Word, PDF och andra format för tvärvetenskapliga dokumentbearbetningspipelines