mcpField
P
pdf

pdf

github.com/zebbernドキュメント4.7k39 回インストール1 日前に更新
リポジトリ

pdf について

Python ライブラリとコマンドラインツールによる PDF 処理の実用ガイドです。文書操作、テキストや表の抽出、PDF 作成、OCRを扱い、フォーム入力や応用編の資料も案内します。

主な機能

  1. 01PDF の結合・分割・回転
  2. 02テキスト・表・メタデータの抽出
  3. 03reportlab による PDF 作成
  4. 04スキャン文書の OCR
  5. 05PDF 用コマンドラインツールの利用
  6. 06フォーム・応用ガイドの案内

活用シーン

  1. 01PDF 文書の結合や分割
  2. 02分析用のテキストや表の抽出
  3. 03複数ページの PDF レポート作成
  4. 04OCR によるスキャン PDF の処理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/zebbern/claude-code-guide --skill pdf

インストール後、Claude Code で/pdfを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

forms.md
reference.md
scripts/
check_bounding_boxes.py
check_fillable_fields.py
convert_pdf_to_images.py
create_validation_image.py
extract_form_field_info.py
extract_form_structure.py
fill_fillable_fields.py
fill_pdf_form_with_annotations.py

詳細

PDF 処理ガイド

概要

このガイドでは、Python ライブラリとコマンドラインツールを使用した、基本的な PDF 処理について説明します。高度な機能、JavaScript ライブラリ、詳しい例については、REFERENCE.md を参照してください。PDF フォームに入力する必要がある場合は、FORMS.md を読み、記載されている手順に従ってください。

クイックスタート

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()

Python ライブラリ

pypdf - 基本操作
PDF の結合
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)
PDF の分割
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)
pdfplumber - テキストと表の抽出
レイアウトを維持したテキストの抽出
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)
reportlab - PDF の作成
基本的な PDF の作成
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()
複数ページの PDF の作成
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)
下付き文字と上付き文字

重要:ReportLab の PDF では、Unicode の下付き文字/上付き文字(₀₁₂₃₄₅₆₇₈₉、⁰¹²³⁴⁵⁶⁷⁸⁹)を決して使用しないでください。組み込みフォントにはこれらのグリフが含まれていないため、黒い四角として表示されます。

代わりに、Paragraph オブジェクトで ReportLab の XML マークアップタグを使用してください。

from reportlab.platypus import Paragraph
from reportlab.lib.styles import getSampleStyleSheet

styles = getSampleStyleSheet()

# Subscripts: use <sub> tag
chemical = Paragraph("H<sub>2</sub>O", styles['Normal'])

# Superscripts: use <super> tag
squared = Paragraph("x<super>2</super> + y<super>2</super>", styles['Normal'])

(Paragraph オブジェクトではない)キャンバスに描画するテキストでは、Unicode の下付き文字/上付き文字を使わず、フォントサイズと位置を手動で調整してください。

コマンドラインツール

pdftotext(poppler-utils)
# 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
qpdf
# 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
pdftk(利用可能な場合)
# Merge
pdftk file1.pdf file2.pdf cat output merged.pdf

# Split
pdftk input.pdf burst

# Rotate
pdftk input.pdf rotate 1east output rotated.pdf

よくあるタスク

スキャンした 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)

クイックリファレンス

タスク最適なツールコマンド/コード
PDF の結合pypdfwriter.add_page(page)
PDF の分割pypdfファイルごとに 1 ページ
テキストの抽出pdfplumberpage.extract_text()
表の抽出pdfplumberpage.extract_tables()
PDF の作成reportlabCanvas または Platypus
コマンドラインでの結合qpdfqpdf --empty --pages ...
スキャンした PDF の OCRpytesseractまず画像に変換
PDF フォームへの入力pdf-lib または pypdf(FORMS.md を参照)FORMS.md を参照

次のステップ

  • pypdfium2 の高度な使い方については、REFERENCE.md を参照してください
  • JavaScript ライブラリ(pdf-lib)については、REFERENCE.md を参照してください
  • PDF フォームに入力する必要がある場合は、FORMS.md の手順に従ってください
  • トラブルシューティングガイドについては、REFERENCE.md を参照してください

コメント