mcpField
P
pdf

pdf

github.com/tfriedelドキュメント844921 回インストール30 週間前に更新
リポジトリ

pdf について

pdf は、Python ライブラリやコマンドラインツールで PDF を読み取り、変換、整理するためのガイドです。ページ操作、テキストや表の抽出、スキャン文書の OCR を扱います。

主な機能

  1. 01PDF の結合、分割、回転
  2. 02テキストとメタデータの抽出
  3. 03表と画像の抽出
  4. 04複数ページ PDF の作成
  5. 05スキャン文書の OCR とフォーム処理の案内

活用シーン

  1. 01レポートからテキストや表を抽出
  2. 02ページ単位の分割や文書の結合
  3. 03スキャン PDF のテキスト化

インストール

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

$npx skills add https://github.com/tfriedel/claude-office-skills --skill pdf

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

同梱ファイル

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

FORMS.md
REFERENCE.md
scripts/
check_bounding_boxes_test.py
check_bounding_boxes.py
check_fillable_fields.py
convert_pdf_to_images.py
create_validation_image.py
extract_form_field_info.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)

コマンドラインツール

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 の分割pypdf1 ファイルにつき 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 を参照してください

コメント