Install
$ agentstack add skill-xushuwenn-redact-pdf-reading ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ● Filesystem access Used
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
PDF Reading Skill
This skill helps agents extract information from PDF documents.
Tools Available
The environment has these PDF tools pre-installed:
pdfplumber- Python library for precise text/table extractionPyPDF2- Python library for PDF manipulationpdftotext- Command-line tool from poppler-utils
Quick Extraction
Command Line (Fast)
# Extract all text from a PDF
pdftotext /root/artifacts/paper.pdf -
# Extract specific pages
pdftotext -f 1 -l 3 /root/artifacts/paper.pdf -
# Extract to a file
pdftotext /root/artifacts/paper.pdf /tmp/paper.txt
Python (More Control)
import pdfplumber
from pathlib import Path
def extract_pdf_text(pdf_path: str) -> str:
"""Extract all text from a PDF file."""
text_parts = []
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
text = page.extract_text()
if text:
text_parts.append(text)
return "\n\n".join(text_parts)
# Usage
text = extract_pdf_text("/root/artifacts/paper.pdf")
print(text)
Extracting Specific Information
Find Commands in Text
import re
def find_commands(text: str) -> list:
"""Extract shell commands from text."""
# Look for common command patterns
patterns = [
r'docker run[^\n]+',
r'\$[^\n]+',
r'--package=[^\s]+\s+--version=[^\s]+',
]
commands = []
for pattern in patterns:
commands.extend(re.findall(pattern, text))
return commands
text = extract_pdf_text("/root/artifacts/paper.pdf")
commands = find_commands(text)
Extract Tables
import pdfplumber
def extract_tables(pdf_path: str) -> list:
"""Extract all tables from a PDF."""
tables = []
with pdfplumber.open(pdf_path) as pdf:
for i, page in enumerate(pdf.pages):
page_tables = page.extract_tables()
for table in page_tables:
tables.append({
"page": i + 1,
"data": table
})
return tables
Find Package Information
import re
def find_package_info(text: str) -> list:
"""Find npm package references (name@version)."""
# Match patterns like node-rsync@1.0.3
pattern = r'([a-z0-9-]+)@(\d+\.\d+\.\d+)'
matches = re.findall(pattern, text.lower())
return [{"name": m[0], "version": m[1]} for m in matches]
Tips
- Check available PDFs first:
``bash ls -la /root/artifacts/ ``
- Preview before full extraction:
``bash pdftotext /root/artifacts/paper.pdf - | head -100 ``
- Handle multi-column layouts: pdfplumber handles them better than pdftotext
- For structured data: Look for JSON blocks in the text:
```python import json import re
jsonblocks = re.findall(r'\{[^{}]*\}', text) for block in jsonblocks: try: data = json.loads(block) print(data) except json.JSONDecodeError: pass ```
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: XuShuwenn
- Source: XuShuwenn/RedAct
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.