Agent Skill
2/7/2026

pdf

Use this skill when you need to extract text, tables, or metadata from PDFs, merge/split documents, add annotations, or create new PDFs programmatically.

C
chocopie116
2GitHub Stars
1Views
npx skills add chocopie116/macbook-provisioning

SKILL.md

Namepdf
DescriptionUse this skill when you need to extract text, tables, or metadata from PDFs, merge/split documents, add annotations, or create new PDFs programmatically.

name: pdf description: "Use this skill when you need to extract text, tables, or metadata from PDFs, merge/split documents, add annotations, or create new PDFs programmatically."

PDF Processing

PDFからテキスト・表・メタデータを抽出し、結合・注釈・変換を行う。

依存ツール

  • pypdf: PDF結合・分割・メタデータ抽出・ページ回転
  • pdfplumber: テキスト・表の抽出(レイアウト保持)
  • reportlab: PDF作成
  • pdftotext (poppler-utils): CLI経由テキスト抽出
  • qpdf: CLI経由で結合・分割・暗号化

インストール

pip install pypdf pdfplumber reportlab
brew install poppler  # pdftotext, pdftoppm含む
brew install qpdf

基本操作

テキスト抽出

pdfplumberでレイアウト保持:

import pdfplumber

with pdfplumber.open("input.pdf") as pdf:
    for page in pdf.pages:
        text = page.extract_text()
        print(text)

CLIでテキスト抽出:

pdftotext -layout input.pdf output.txt

表の抽出

import pdfplumber
import pandas as pd

with pdfplumber.open("input.pdf") as pdf:
    page = pdf.pages[0]
    table = page.extract_table()
    df = pd.DataFrame(table[1:], columns=table[0])
    df.to_excel("output.xlsx", index=False)

PDF結合

pypdfで結合:

from pypdf import PdfWriter

merger = PdfWriter()
for pdf_file in ["file1.pdf", "file2.pdf", "file3.pdf"]:
    merger.append(pdf_file)

merger.write("merged.pdf")
merger.close()

qpdfで結合:

qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf

PDF分割

from pypdf import PdfReader, PdfWriter

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 f:
        writer.write(f)

メタデータ抽出

from pypdf import PdfReader

reader = PdfReader("input.pdf")
metadata = reader.metadata
print(f"Title: {metadata.title}")
print(f"Author: {metadata.author}")
print(f"Pages: {len(reader.pages)}")

ページ回転

from pypdf import PdfReader, PdfWriter

reader = PdfReader("input.pdf")
writer = PdfWriter()

for page in reader.pages:
    page.rotate(90)  # 90度回転
    writer.add_page(page)

with open("rotated.pdf", "wb") as f:
    writer.write(f)

高度な操作

PDFから画像抽出

# 各ページをPNG画像として抽出
pdftoppm -png input.pdf output
# → output-1.png, output-2.png, ...

パスワード保護

qpdf --encrypt user-password owner-password 256 -- input.pdf encrypted.pdf

OCR(スキャンPDF)

スキャンされたPDFの場合、OCRが必要:

brew install tesseract
pip install pytesseract pdf2image

# Python
from pdf2image import convert_from_path
import pytesseract

images = convert_from_path("scanned.pdf")
text = ""
for img in images:
    text += pytesseract.image_to_string(img, lang='jpn')
print(text)

ウォーターマーク追加

from pypdf import PdfReader, PdfWriter
from pypdf.generic import Transformation

reader = PdfReader("input.pdf")
watermark = PdfReader("watermark.pdf")
writer = PdfWriter()

for page in reader.pages:
    page.merge_page(watermark.pages[0])
    writer.add_page(page)

with open("watermarked.pdf", "wb") as f:
    writer.write(f)

トラブルシューティング

レイアウトが崩れる

pdfplumberextract_text(layout=True)を試す

表が正しく抽出されない

table_settingsパラメータを調整

日本語が文字化け

→ OCRの場合はlang='jpn'を指定、フォント埋め込み確認

参考

Skills Info
Original Name:pdfAuthor:chocopie116