用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/HKUDS/OpenSpace --skill pdf-extraction-fallback命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Incremental audio production with duration mismatch handling, adaptive stem extension, and pre-mix alignment verification
Audio production with diagnostic analysis, timecode parsing from documents, and verified export workflow
Incremental audio production with duration alignment handling, per-stem verification, and adaptive extension strategies
基于 SOC 职业分类
正在显示 SKILL.md
| name | pdf-extraction-fallback |
| description | Multi-stage fallback strategy for PDF/document extraction using sequential tool alternatives |
When processing documents (especially PDFs), initial extraction attempts may fail due to formatting, encryption, or tool limitations. This skill provides a systematic fallback approach that tries multiple extraction methods before declaring failure.
Never declare completion after a single tool failure. Instead, iterate through a hierarchy of extraction methods, each with different capabilities and limitations.
Attempt extraction methods in this order:
Try native PDF libraries first (fastest, preserves structure):
import PyPDF2
from pypdf import PdfReader
def extract_with_pypdf(pdf_path):
reader = PdfReader(pdf_path)
text = ""
for page in reader.pages:
text += page.extract_text() or ""
return text
If Stage 1 fails, use system tools:
# Install if needed: apt-get install poppler-utils
pdftotext -layout input.pdf output.txt
pdftotext -raw input.pdf output.txt # Alternative layout
import subprocess
def extract_with_pdftotext(pdf_path):
result = subprocess.run(
['pdftotext', '-layout', pdf_path, '-'],
capture_output=True, text=True
)
if result.returncode == 0:
return result.stdout
raise Exception("pdftotext failed")
Try different Python libraries with varying capabilities:
# pdfplumber - better for tables
import pdfplumber
def extract_with_pdfplumber(pdf_path):
text = ""
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
text += page.extract_text() or ""
return text
# pdfminer - handles complex layouts
from pdfminer.high_level import extract_text
def extract_with_pdfminer(pdf_path):
return extract_text(pdf_path)
For scanned images or when text extraction fails:
# Using tesseract
convert input.pdf output-%d.png # Convert to images first
tesseract output-0.png result --psm 6
# Using pytesseract
from pdf2image import convert_from_path
import pytesseract
def extract_with_ocr(pdf_path):
images = convert_from_path(pdf_path, dpi=300)
text = ""
for image in images:
text += pytesseract.image_to_string(image)
return text
def robust_pdf_extraction(pdf_path):
"""Try multiple extraction methods until one succeeds."""
extraction_methods = [
("PyPDF2", extract_with_pypdf),
("pdftotext", extract_with_pdftotext),
("pdfplumber", extract_with_pdfplumber),
("pdfminer", extract_with_pdfminer),
("OCR", extract_with_ocr),
]
errors = []
for method_name, method_func in extraction_methods:
try:
print(f"Trying {method_name}...")
text = method_func(pdf_path)
if text and text.strip():
print(f"Success with {method_name}")
return text
else:
errors.append(f"{method_name}: empty result")
except Exception as e:
errors.append(f"{method_name}: {str(e)}")
print(f"{method_name} failed: {e}")
continue
# All methods failed
raise Exception(f"All extraction methods failed:\n" + "\n".join(errors))
A method is considered successful when:
| Symptom | Likely Cause | Best Fallback |
|---|---|---|
| Empty pages | Image-based PDF | OCR (Stage 4) |
| Garbled text | Encoding issues | pdftotext (Stage 2) |
| Missing tables | Simple parser | pdfplumber (Stage 3) |
| Permission errors | Encrypted PDF | Check password/permissions first |
| Layout lost | Complex formatting | pdftotext -layout or pdfplumber |