mcpField
P
pdf

pdf

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

pdf について

Python ライブラリとコマンドラインツールを使った PDF 操作の実用ガイドです。PDF の抽出、再編成、作成が必要な開発者や利用者向けに、テキスト、表、画像、OCR の例を紹介します。

主な機能

  1. 01PDF のテキストとメタデータ抽出
  2. 02ページの結合、分割、回転
  3. 03表と画像の抽出
  4. 04reportlab による PDF 作成
  5. 05スキャン文書の OCR

活用シーン

  1. 01PDF からテキストや表を抽出
  2. 02文書ファイルの結合や分割
  3. 03PDF レポートの作成
  4. 04OCR によるスキャンページの処理

インストール

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

$npx skills add https://github.com/ovachiever/droid-tings --skill pdf

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

同梱ファイル

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

forms.md
LICENSE.txt
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 を OCR 処理するpytesseract先に画像に変換
PDF フォームに入力するpdf-lib または pypdf(forms.md を参照)forms.md を参照

次のステップ

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

コメント