Extrahera text från PDF-filer med PDFMiner i Python
Behärska extrahering av PDF-text med Python
PDFMiner.six är en kraftfull Python-bibliotek för att extrahera text, metadata och layoutinformation från PDF-dokument. Den här guiden är en del av vår Dokumentationsverktyg i 2026: Markdown, LaTeX, PDF & Skrivningsflöden hub.
Skiljer sig från enkla PDF-läsare, ger den 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. Versionen .six är den aktivt underhållna grenen 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 teckenkodning
- 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 kolumnsdokument. Ä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 flö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-snabbguide 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-filerdumppdf.py- Dumpa PDF:s inre strukturlatin2ascii.py- Konvertera latinbokstäver till ASCII
Dessa verktyg kompletterar andra PDF-manipuleringsverktyg som Poppler som tillhandahåller ytterligare funktioner som sidextrahering 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öglevel-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 siditeration
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())
Den här metoden ger dig mer kontroll över hur varje sida bearbetas, användbar när du arbetar med dokument där sidstruktur varierar.
Avancerad layoutanalys
Förstå LAParams
LAParams (Layout Analysis Parameters) styr hur PDFMiner tolkar dokumentlayout. Förståelsen av skillnaden mellan PDFMiner och enklare bibliotek är avgörande här - PDFMiner analyserar faktiskt de spatiala relationerna mellan textelementen.
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Skapa anpassade LAParams
laparams = LAParams(
line_overlap=0.5, # Minsta överlapp för textrader
char_margin=2.0, # Teckenmarginal
line_margin=0.5, # Radmarginal
word_margin=0.1, # Ordavstånd
boxes_flow=0.5, # Boxflödesgräns
detect_vertical=True, # Detektera vertikal text
all_texts=False # Extrahera endast text i boxar
)
text = extract_text('document.pdf', laparams=laparams)
Parametertolkning:
line_overlap: Hur mycket rader måste överlappa vertikalt för att anses vara samma rad (0.0-1.0)char_margin: Maximalt avstånd mellan tecken i samma ord (som multipel av teckenbredden)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 detektering 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å koordinater för bounding box
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å detaljer på tecken-nivå
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 nivån av detaljer är värdefull för dokumentanalys, formulär extrahering eller när du behöver förstå dokumentstruktur programmatiskt.
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')
Observera att PDFMiner kan endast extrahera text från PDF:er - det kan inte undvika säkerhetsrestriktioner som förhindrar textextrahering på PDF-nivå.
Flera kolumner i dokument
För dokument med flera kolumner, justera LAParams:
from pdfminer.high_level import extract_text
from pdfminer.layout import LAParams
# Optimera för flera kolumnlayouter
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 kolumnidentifiering
)
text = extract_text('multi_column.pdf', laparams=laparams)
Parametern boxes_flow är särskilt viktig för flera kolumnlayouter - 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 använda rätt 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 identifiera 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:n 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
# Använda 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
# Ange lösenord för krypterad PDF
pdf2txt.py -P mypassword encrypted.pdf
Dessa kommandoradsverktyg är utmärkta för snabb testning, skript i kommandoraden och integration i automatiserade flö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) # Mycket 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 blandad 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 ligger ihop 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ävande tecken eller kodningsfel.
Lösning: Specificera kodning explicit:
text = extract_text('document.pdf', codec='utf-8')
Problem: Minnesfel med stora PDF:er
Problem: Minnesfel vid stora filer.
Lösning: Bearbeta sida för sida:
def extract_text_chunked(pdf_path, chunk_size=10):
"""Extrahera text i chunkar 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 chunkar
if page_count % chunk_size == 0:
yield ''.join(all_text)
all_text = []
# Yield kvarvarande text
if all_text:
yield ''.join(all_text)
Jämföra PDFMiner med 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, sammanslagning/dela av 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: Tabell extrahering, enklare API, snabb prototypning
- Använd PDFMiner för: Maximal kontroll, anpassad bearbetning, produktions-system
PDFMiner vs PyMuPDF (fitz)
PyMuPDF är mycket 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 dokumentanalys:
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)
# Statistik
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"Antal sidor: {result['stats']['pages']}")
print(f"Antal 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 dokumentbearbetningsflöden. Till exempel, när du bygger RAG (Retrieval-Augmented Generation)-system eller dokumenthanteringssystem, kan du kombinera det med andra Python-verktyg 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 Python-bibliotek eller till och med utnyttja LLM-driven konvertering med Ollama för intelligenta dokumentomvandlingar. 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 Markdown-konvertering, skapa en enhetlig workflow 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 försiktigt - PDF-filer kan vara skadade eller felaktiga. 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ändningsscenarier - Även om PDFMiner är kraftfull, kan ibland specialiserade verktyg (t.ex. tabula-py för tabeller) vara mer lämpliga.
-
Håll PDFMiner uppdaterat -
.six-grenen underhålls aktivt. Håll den uppdaterad för felsökning och förbättringar. -
Dokumentera din kod noggrant - 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 Python-utvecklare som arbetar med PDF-dokument. Den ren Python-implementeringen, detaljerade layoutanalysen och utökbara arkitekturen gör den idealisk för produktionsdokumentbearbetningssystem. Även om den kan ha en brantare inlärningskurva än enklare bibliotek, är noggrannheten och kontrollen den erbjuder oöverskådliga för komplexa PDF-extraheringsscenarier.
Vänligen, om 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
- Dokumentationsverktyg i 2026: Markdown, LaTeX, PDF & Skrivningsflöden
- Pdf manipuleringsverktyg i Ubuntu - Poppler - Komplett guide till kommandoradsverktyg för PDF inklusive pdftotext, pdfimages och andra poppler-verktyg som fungerar tillsammans med PDFMiner i dokumentbearbetningsflöden
- Hur man extraherar bilder från PDF - Snabbguide - Lär dig hur du extraherar inbäddade bilder från PDF:er med poppler-kommandoradsverktyg, komplementerande PDFMiners textextraheringsförmåga
- Generera PDF i Python - Bibliotek och exempel - Utforska Python-bibliotek för PDF-generering inklusive ReportLab, PyPDF2 och FPDF för att skapa den omvända flödet av PDF-textextrahering
- Python-snabbguide - Essentiell Python-syntaxreferens inklusive filhantering, strängoperationer och bästa praxis för att skriva ren PDF-bearbetningskod