一键导入
当需要操作 PDF 文件时使用:读取/提取 PDF 内容、PDF 转文字、合并/拆分 PDF、 填写 PDF 表单、加水印、OCR 扫描件、PDF 加密解密。 当用户说「读取PDF」「提取PDF内容」「合并PDF」「PDF转文字」「处理PDF」「OCR」时,立即使用此技能。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
当需要操作 PDF 文件时使用:读取/提取 PDF 内容、PDF 转文字、合并/拆分 PDF、 填写 PDF 表单、加水印、OCR 扫描件、PDF 加密解密。 当用户说「读取PDF」「提取PDF内容」「合并PDF」「PDF转文字」「处理PDF」「OCR」时,立即使用此技能。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
战略沙盘 skill。用于高阶产品战略推演、智囊团对话、项目级或产品级多项目战略议题讨论,帮助用户在正式规划、汇报或决策前拆解问题、暴露假设、进行多视角交锋和表达预演。Use when the user asks for 战略沙盘、战略推演、智囊团、产品战略、下一阶段方向、资源取舍、产品级战略、多项目推演、增长瓶颈、竞争应对、用户心智、组织协同、汇报前战略预演,或使用 `/ai-pm strategy` / `/ai-pm-strategy`。
数据分析技能。提供数据指标设计、数据洞察分析、仪表盘生成三大能力。从数据中发现产品需求和优化机会。 当用户说「分析数据」「上传Excel」「数据洞察」「数据可视化」「做仪表盘」「数据看板」 「指标设计」「埋点方案」「从数据里找需求」「数据报表」时,立即使用此技能。
PRD 生成技能。整合需求分析、竞品研究、用户故事,输出完整的产品需求文档。支持产品分身写作风格和设计规范。 当用户说「生成PRD」「写PRD」「产品需求文档」「需求文档」「功能规格书」「输出PRD」 「帮我写需求」「把需求整理成文档」时,立即使用此技能。
原型生成技能。基于 PRD 生成可交互的单页网页原型,支持移动端和 Web 端。 首次生成时询问设计规范(公司规范 / AI 情境定制 / 主流组件库),项目内记住偏好。 若项目存在 Codex 生成的视觉锚点包(06-prototype-visual/manifest.json),生成 HTML 前必须读取并遵循。 当用户说「生成原型」「做原型」「可交互原型」「HTML原型」「页面原型」「低保真」「高保真原型」 「画个界面」「把PRD做成原型」时,立即使用此技能。 边界:本技能用于「把已有 PRD/需求做成可评审原型」;脱离 PRD 的纯视觉探索、通用 UI 组件生成或视觉精修,可使用外部 impeccable 增强,但 AI_PM 原型默认以 ai-pm-frontend-design 为本地设计内核。
当需要从零开始走完完整产品立项流程(需求→分析→竞品→用户故事→PRD→原型→评审)时使用。 支持多项目管理和断点续传,复杂需求可启用多代理协作。 当用户说「我有个产品想法」「帮我做个产品」「从零开始做需求」「全流程出PRD」 「做一个App/小程序/系统」「产品立项」「继续上次的项目」「切换项目」时,立即使用此技能。
去除中文文本里的 AI 腔,让文字像真人直白写出来的。针对中文语境的真·AI tell: 工整对仗排比、"通过X实现Y"、范畴词冗余(进行了优化/起到…作用)、互联网黑话堆砌 (赋能/抓手/闭环/颗粒度)、强行升华结尾、程度副词通胀、空泛连接词、规整书面腔。 并压住"去 AI 味后滑向文青腔/段子腔"的冲动——目标是直白大白话,不是有文采。 可选用本机真实语料把文字校准到具体某个人的声音。
| name | |
| description | 当需要操作 PDF 文件时使用:读取/提取 PDF 内容、PDF 转文字、合并/拆分 PDF、 填写 PDF 表单、加水印、OCR 扫描件、PDF 加密解密。 当用户说「读取PDF」「提取PDF内容」「合并PDF」「PDF转文字」「处理PDF」「OCR」时,立即使用此技能。 |
| license | Proprietary. LICENSE.txt has complete terms |
This guide covers essential PDF processing operations using Python libraries and command-line tools. For advanced features, JavaScript libraries, and detailed examples, see reference.md. If you need to fill out a PDF form, read forms.md and follow its instructions.
from pypdf import PdfReader, PdfWriter
# Read a PDF
reader = PdfReader("document.pdf")
print(f"Pages: {len(reader.pages)}")
# Extract text
text = ""
for page in reader.pages:
text += page.extract_text()
from pypdf import PdfWriter, PdfReader
writer = PdfWriter()
for pdf_file in ["doc1.pdf", "doc2.pdf", "doc3.pdf"]:
reader = PdfReader(pdf_file)
for page in reader.pages:
writer.add_page(page)
with open("merged.pdf", "wb") as output:
writer.write(output)
reader = PdfReader("input.pdf")
for i, page in enumerate(reader.pages):
writer = PdfWriter()
writer.add_page(page)
with open(f"page_{i+1}.pdf", "wb") as output:
writer.write(output)
reader = PdfReader("document.pdf")
meta = reader.metadata
print(f"Title: {meta.title}")
print(f"Author: {meta.author}")
print(f"Subject: {meta.subject}")
print(f"Creator: {meta.creator}")
reader = PdfReader("input.pdf")
writer = PdfWriter()
page = reader.pages[0]
page.rotate(90) # Rotate 90 degrees clockwise
writer.add_page(page)
with open("rotated.pdf", "wb") as output:
writer.write(output)
import pdfplumber
with pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
text = page.extract_text()
print(text)
with pdfplumber.open("document.pdf") as pdf:
for i, page in enumerate(pdf.pages):
tables = page.extract_tables()
for j, table in enumerate(tables):
print(f"Table {j+1} on page {i+1}:")
for row in table:
print(row)
import pandas as pd
with pdfplumber.open("document.pdf") as pdf:
all_tables = []
for page in pdf.pages:
tables = page.extract_tables()
for table in tables:
if table: # Check if table is not empty
df = pd.DataFrame(table[1:], columns=table[0])
all_tables.append(df)
# Combine all tables
if all_tables:
combined_df = pd.concat(all_tables, ignore_index=True)
combined_df.to_excel("extracted_tables.xlsx", index=False)
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
c = canvas.Canvas("hello.pdf", pagesize=letter)
width, height = letter
# Add text
c.drawString(100, height - 100, "Hello World!")
c.drawString(100, height - 120, "This is a PDF created with reportlab")
# Add a line
c.line(100, height - 140, 400, height - 140)
# Save
c.save()
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak
from reportlab.lib.styles import getSampleStyleSheet
doc = SimpleDocTemplate("report.pdf", pagesize=letter)
styles = getSampleStyleSheet()
story = []
# Add content
title = Paragraph("Report Title", styles['Title'])
story.append(title)
story.append(Spacer(1, 12))
body = Paragraph("This is the body of the report. " * 20, styles['Normal'])
story.append(body)
story.append(PageBreak())
# Page 2
story.append(Paragraph("Page 2", styles['Heading1']))
story.append(Paragraph("Content for page 2", styles['Normal']))
# Build PDF
doc.build(story)
# Extract text
pdftotext input.pdf output.txt
# Extract text preserving layout
pdftotext -layout input.pdf output.txt
# Extract specific pages
pdftotext -f 1 -l 5 input.pdf output.txt # Pages 1-5
# Merge PDFs
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
# Split pages
qpdf input.pdf --pages . 1-5 -- pages1-5.pdf
qpdf input.pdf --pages . 6-10 -- pages6-10.pdf
# Rotate pages
qpdf input.pdf output.pdf --rotate=+90:1 # Rotate page 1 by 90 degrees
# Remove password
qpdf --password=mypassword --decrypt encrypted.pdf decrypted.pdf
# Merge
pdftk file1.pdf file2.pdf cat output merged.pdf
# Split
pdftk input.pdf burst
# Rotate
pdftk input.pdf rotate 1east output rotated.pdf
# Requires: pip install pytesseract pdf2image
import pytesseract
from pdf2image import convert_from_path
# Convert PDF to images
images = convert_from_path('scanned.pdf')
# OCR each page
text = ""
for i, image in enumerate(images):
text += f"Page {i+1}:\n"
text += pytesseract.image_to_string(image)
text += "\n\n"
print(text)
from pypdf import PdfReader, PdfWriter
# Create watermark (or load existing)
watermark = PdfReader("watermark.pdf").pages[0]
# Apply to all pages
reader = PdfReader("document.pdf")
writer = PdfWriter()
for page in reader.pages:
page.merge_page(watermark)
writer.add_page(page)
with open("watermarked.pdf", "wb") as output:
writer.write(output)
# Using pdfimages (poppler-utils)
pdfimages -j input.pdf output_prefix
# This extracts all images as output_prefix-000.jpg, output_prefix-001.jpg, etc.
from pypdf import PdfReader, PdfWriter
reader = PdfReader("input.pdf")
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
# Add password
writer.encrypt("userpassword", "ownerpassword")
with open("encrypted.pdf", "wb") as output:
writer.write(output)
| Task | Best Tool | Command/Code |
|---|---|---|
| Merge PDFs | pypdf | writer.add_page(page) |
| Split PDFs | pypdf | One page per file |
| Extract text | pdfplumber | page.extract_text() |
| Extract tables | pdfplumber | page.extract_tables() |
| Create PDFs | reportlab | Canvas or Platypus |
| Command line merge | qpdf | qpdf --empty --pages ... |
| OCR scanned PDFs | pytesseract | Convert to image first |
| Fill PDF forms | pdf-lib or pypdf (see forms.md) | See forms.md |