
pdf-look-scanned
Make PDF documents look like they were scanned on a physical scanner. Applies realistic effects: grayscale conversion, Gaussian noise, slight rotation, blur, edge shadows, and random offset. Optionally extract real handwritten signatures from a source PDF (or user-provided images) and replace digital signatures on specific pages. Use when the user asks to: make a PDF look scanned, give a PDF a scanned appearance, replace digital signatures with real/handwritten ones, fake a scan, add scan effects to a document, or make a document look printed and scanned.
- Installs
- 49
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/vladmdgolam/agent-skills --skill pdf-look-scanned- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads pdf-look-scanned automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
PDF Look Scanned
Make PDFs look like physical scans with optional signature replacement.
Dependencies
pip3 install pillow pdf2image img2pdf numpy
Also requires poppler (provides pdftoppm):
- macOS:
brew install poppler - Ubuntu/Debian:
apt install poppler-utils - Fedora/RHEL:
dnf install poppler-utils - Arch:
pacman -S poppler - Windows:
conda install -c conda-forge poppleror download from poppler releases
Quick Start
Run scripts/make_scanned.py for the core functionality. Read the script's --help for all options.
Simple scan effect
python3 scripts/make_scanned.py document.pdf
Adjust scan quality
Lower DPI and quality = grittier, more realistic cheap-scanner look:
python3 scripts/make_scanned.py document.pdf --dpi 150 --quality 75 --noise 7
Higher DPI = cleaner scan, larger file:
python3 scripts/make_scanned.py document.pdf --dpi 300 --quality 92
Signature Replacement
Finding signature coordinates
Before replacing signatures, determine crop and placement coordinates. All coordinates are fractions of page dimensions (0.0-1.0).
- Convert the source PDF to images and visually inspect to find the signature region
- Iteratively crop to isolate just the signature ink (no text, no table lines)
- On the target PDF, find the area to clear (old digital signature) and where to paste
Use this Python snippet to explore coordinates interactively:
from pdf2image import convert_from_path
from PIL import Image
pages = convert_from_path("document.pdf", dpi=200)
page = pages[0] # 0-indexed
w, h = page.size
# Crop a region and save for inspection
crop = page.crop((int(w*0.5), int(h*0.4), int(w*0.8), int(h*0.6)))
import tempfile, os
crop.save(os.path.join(tempfile.gettempdir(), "crop_test.png"))
Replace one signature
python3 scripts/make_scanned.py contract.pdf \
--sig-pdf signatures.pdf \
--sig-page 1 --sig-crop 0.41,0.33,0.62,0.42 \
--sig-target 25 --sig-clear 0.61,0.41,0.85,0.52 --sig-place 0.62,0.415
Replace multiple different signatures
Each set of --sig-page, --sig-crop, --sig-target, --sig-clear, --sig-place adds one replacement. They are matched positionally:
python3 scripts/make_scanned.py contract.pdf \
--sig-pdf signatures.pdf \
--sig-page 1 --sig-crop 0.41,0.33,0.62,0.42 \
--sig-target 25 --sig-clear 0.61,0.41,0.85,0.52 --sig-place 0.62,0.415 \
--sig-page 2 --sig-crop 0.40,0.335,0.62,0.39 \
--sig-target 27 --sig-clear 0.61,0.635,0.85,0.72 --sig-place 0.60,0.655
Signature parameters
| Parameter | Description |
|---|---|
--sig-pdf | Source PDF containing real signatures |
--sig-page N | Page number in source PDF (1-indexed) |
--sig-crop L,T,R,B | Crop box to extract signature (fractions) |
--sig-target N | Target page to replace signature on (1-indexed) |
--sig-clear L,T,R,B | Area to white-out old signature (fractions) |
--sig-place X,Y | Top-left position to paste new signature (fractions) |
--sig-size F | Signature width as fraction of page width (default: 0.11) |
--sig-dpi N | DPI for rendering source signature PDF (default: 350) |
Scan effect parameters
| Parameter | Default | Effect |
|---|---|---|
--dpi | 200 | Render resolution. Lower = grittier |
--quality | 85 | JPEG compression. Lower = more artifacts |
--noise | 5.0 | Gaussian noise stddev. Higher = noisier |
--blur | 0.6 | Gaussian blur radius. Higher = softer |
--rotation | 0.7 | Max rotation in degrees |
--contrast-min | 0.88 | Min contrast (lower = more washed out) |
--contrast-max | 0.95 | Max contrast |
Workflow for signature replacement
When the user provides a PDF and a separate signature source:
- Check dependencies are installed (
pillow,pdf2image,img2pdf,numpy,poppler) - Examine the source signature PDF — convert to images, identify which pages have signatures
- Extract signatures — iteratively crop to isolate the ink, verify no text bleeds in
- Examine the target PDF — find pages with digital signatures, note the "Подпись:" or "Signature:" label positions
- Determine coordinates — clear area must cover old signature without eating into labels; place position should be right after the label
- Run the script with all parameters
- Verify output — check signature pages visually, adjust coordinates if needed
- Check metadata — run
exiftoolon the output to ensure no software traces remain
Common pitfalls:
- Crop box too tight: signature strokes get clipped on edges
- Clear area too wide: eats into "Подпись:"/"Signature:" labels or surrounding text
- Signature too large/small: adjust
--sig-size(0.11 is typical for contracts) - Source PDF is a phone photo: use higher
--sig-dpi(350+) and higher ink threshold
FAQ
What does the pdf-look-scanned skill do?
Make PDF documents look like they were scanned on a physical scanner. Applies realistic effects: grayscale conversion, Gaussian noise, slight rotation, blur, edge shadows, and random offset. Optionally extract real handwritten signatures from a source PDF (or user-provided images) and replace digital signatures on specific pages. Use when the user asks to: make a PDF look scanned, give a PDF a scanned appearance, replace digital signatures with real/handwritten ones, fake a scan, add scan effects to a document, or make a document look printed and scanned.
How do I install pdf-look-scanned?
Run npx skills add https://github.com/vladmdgolam/agent-skills --skill pdf-look-scanned in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/pdf-look-scanned/ (personal) or .claude/skills/pdf-look-scanned/ (project).
Which AI agents can use pdf-look-scanned?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is pdf-look-scanned safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains pdf-look-scanned?
It is published by vladmdgolam in vladmdgolam/agent-skills. It has 49 recorded installs.
More from vladmdgolam/agent-skills
blender-mcp
vladmdgolam/agent-skills
Blender MCP expert for scene inspection, Python scripting, GLTF export, and material/animation extraction. Activate when: (1) using Blender MCP tools (getsceneinfo, executepython, screenshot, etc.), (2) writing Blender Python scripts for extraction or manipulation, (3) exporting scenes to GLTF/GLB for web (Three.js, R3F), (4) debugging material or texture export losses, (5) optimizing GLB files with gltf-transform, (6) using asset integrations (PolyHaven, Sketchfab, Hyper3D Rodin, Hunyuan3D). Covers critical export gotchas, material mapping survival, texture optimization pipeline, headless CLI patterns, and known failure modes.
cinema4d-mcp
vladmdgolam/agent-skills
Cinema 4D MCP expert for extracting scene data, writing C4D Python scripts, and controlling Cinema 4D through MCP tools. Activate when: (1) using cinema4d MCP tools (getsceneinfo, listobjects, executepythonscript, addprimitive, etc.), (2) writing Python scripts for Cinema 4D extraction or manipulation, (3) working with MoGraph cloners/effectors/fields, (4) baking animation data from C4D scenes, (5) debugging C4D Python API errors, (6) extracting Redshift material or camera data. Covers critical gotchas, correct extraction patterns, MoGraph baking, timeline evaluation, API compatibility, and known failure modes.
visual-feedback-loop
vladmdgolam/agent-skills
Open the skill to read its SKILL.md instructions.
reverse-engineer-js
vladmdgolam/agent-skills
Reverse-engineer minified or obfuscated JavaScript bundles. Primary tool: humanify (humanifyjs) — uses an LLM to rename mangled identifiers back to meaningful names. Default model: gemini-3.8-flash. Use when the user says 'deobfuscate this bundle', 'humanify this', 'rename minified vars', 'reverse engineer this JS', 'what does bundle.js do', or is working in a project with a deobfuscated og/ or modules/ folder fed by humanify. Covers humanify CLI invocation, the pseudo-TTY workaround for cursorTo crashes, single-module extraction from a bundle, and chaining with beautifiers.
time-lens
vladmdgolam/agent-skills
Analyze and visualize time spent on software projects by combining data from multiple sources: WakaTime coding time, git commit session detection, Claude Code usage, Codex CLI usage, and Cursor IDE usage. Produces both an interactive HTML dashboard (dark-themed, Chart.js) and a Markdown report with ASCII charts. Use when the user asks to: analyze work hours, calculate time spent on a project, generate a work hours report, visualize coding activity, create a project time breakdown, or summarize development effort across date ranges.
figma-context-mcp
vladmdgolam/agent-skills
Expert guide for using the Figma Context MCP (Framelink) efficiently while avoiding 429 rate-limit errors. Activate when: (1) using Framelink Figma MCP tools (getfigmadata, downloadfigmaimages), (2) fetching Figma designs for code generation, (3) user hits 429 rate limits from Figma API, (4) extracting design tokens or component data from Figma, (5) downloading Figma assets/images, (6) any design-to-code workflow involving Figma URLs. Covers metadata-first fetching, depth-limited node trees, batch image downloads, rate-limit diagnostics, and plan-tier awareness.
Popular docs & writing skills
grill-with-docs
mattpocock/skills
A relentless interview to sharpen a plan or design, which also creates docs (ADR's and glossary) as we go.
lark-markdown
open.feishu.cn
飞书 Markdown:查看、创建、上传、编辑和比较飞书中的原生 Markdown 文件。当用户要操作飞书 Markdown 文件,或比较其远端版本及本地草稿时使用。纯本地 Markdown 文件操作不触发本 skill。不负责将 Markdown 导入为飞书在线文档,也不负责文件搜索、权限、评论、移动、删除等云空间管理操作。
writing-beats
mattpocock/skills
Writing, exploit; assemble raw material into a journey of beats, grounding each term before a beat leans on it.
writing-shape
mattpocock/skills
Writing, exploit: shape raw material into an article, paragraph by paragraph.
writing-fragments
mattpocock/skills
Writing, explore: mine raw fragments, no structure yet.
writing-for-agents
mattpocock/skills
Writing documents for agents. Use when creating or editing skills, or modifying AGENTS.md or CLAUDE.md.