Utilisez cette fonctionnalité chaque fois que l'utilisateur souhaite effectuer une opération sur des fichiers PDF. Cela inclut la lecture ou l'extraction de texte/tableaux à partir de fichiers PDF, la combinaison ou la fusion de plusieurs fichiers PDF en un seul, le fractionnement de fichiers PDF, la rotation de pages, l'ajout de filigranes, la création de nouveaux fichiers PDF, le remplissage de formulaires PDF, le chiffrement/déchiffrement de fichiers PDF, l'extraction d'images et la reconnaissance optique de caractères (OCR) sur des fichiers PDF numérisés afin de les rendre consultables. Si l'utilisateur mentionne un fichier .pdf ou demande d'en créer un, utilisez cette compétence.
...Développer toutPDF Guide de traitement
Présentation
Ce guide couvre les opérations de traitement essentielles d'PDF s à l'aide de bibliothèques Python et d'outils en ligne de commande. Pour les fonctionnalités avancées, les bibliothèques JavaScript et des exemples détaillés, consultez REFERENCE.md. Si vous devez remplir un formulaire PDF, lisez FORMS.md et suivez les instructions qui y figurent.
Démarrage rapide
from pypdf import PdfReader, Pdf Writer# Lire un PDF
reader = PdfReader("document.pdf")
print(f"Pages : {len(reader.pages)}")# Extraire le texte
text = ""
for page in reader.pages:
text += page.extract_text()
Bibliothèques Python
pypdf - Opérations de base
Fusionner des fichiers « PDFs»
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)
Fusionner 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)
Extraire les métadonnées
reader = PdfReader("document.pdf")
meta = reader.metadata
print(f"Titre : {meta.title}")
print(f"Auteur : {meta.author}")
print(f"Sujet : {meta.subject}")
print(f"Créateur : {meta.creator}")
Faire pivoter les pages
reader = PdfReader("input.pdf")
writer = PdfWriter()page = reader.pages[0]
page.rotate(90) # Rotation de 90 degrés dans le sens des aiguilles d'une montre
writer.add_page(page)with open("rotated.pdf", "wb") as output:
writer.write(output)
pdfplumber - Extraction de texte et de tableaux
Extraction de texte avec mise en page
import pdfplumberwith pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
text = page.extract_text()
print(text)
Extraire les tableaux
avec 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"Tableau {j+1} à la page {i+1}:")
for row in table:
print(row)
Extraction avancée de tableaux
import pandas aspdwith pdfplumber.open("document.pdf") as pdf:
all_tables = []
for page in pdf.pages:
tables = page.extract_tables()
for table in tables:
if table: # Vérifier que le tableau n'est pas vide
df = pd.DataFrame(table[1:], columns=table[0])
all_tables.append(df)# Combiner toutes les tables
if all_tables:
combined_df = pd.concat(all_tables,ignore_index=True)
combined_df.to_excel("extracted_tables.xlsx",index=False)
reportlab - Créer des fichiers « PDFs»
Création d’un document « PDF » de base
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
c = canvas.Canvas("hello.pdf", pagesize=letter)
width, height = letter# Ajouter du texte
c.drawString(100, height - 100, "Hello World!")
c.drawString(100, height - 120, "Ceci est un PDF créé avec reportlab")# Ajouter une ligne
c.line(100, height - 140, 400, height - 140)# Enregistrer
c.save()
Créer un PDF e comportant plusieurs pages
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak
from reportlab.lib.styles import getSampleStyleSheetdoc = SimpleDocTemplate("report.pdf", pagesize=letter)
styles = getSampleStyleSheet()
story = []# Ajouter du contenu
title = Paragraph("Titre du rapport", styles['Title'])
story.append(title)
story.append(Spacer(1, 12))body = Paragraph("Ceci est le corps du rapport. " * 20, styles['Normal'])
story.append(body)
story.append(PageBreak())# Page 2
story.append(Paragraph("Page 2", styles['Heading1']))
story.append(Paragraph("Contenu de la page 2", styles['Normal']))# Générer l'PDF
doc.build(story)
Indices et exposants
IMPORTANT: N’utilisez jamais les caractères Unicode en indice ou en exposant (₀₁₂₃₄₅₆₇₈₉, ⁰¹²³⁴⁵⁶⁷⁸⁹) dans les documents ReportLab PDF. Les polices intégrées ne contiennent pas ces glyphes, ce qui entraîne leur affichage sous forme de carrés noirs pleins.
Utilisez plutôt les balises XML de ReportLab dans les objets Paragraph :
from reportlab.platypus import Paragraph
from reportlab.lib.styles import getSampleStyleSheetstyles = getSampleStyleSheet()# Indices : utilisez la balise chemical = Paragraph("H2O", styles['Normal'])# Exposants : utilisez la balise squared = Paragraph("x² +y² ", styles['Normal'])
Pour le texte dessiné sur le canevas (et non les objets Paragraph), ajustez manuellement la taille et la position de la police plutôt que d’utiliser les indices et exposants Unicode.
Outils en ligne de commande
pdftotext (poppler-utils)
# Extraire du texte
pdftotext input.pdf output.txt# Extraire du texte en conservant la mise en page
pdftotext -layout input.pdf output.txt# Extraire des pages spécifiques
pdftotext -f 1 -l 5 input.pdf output.txt # Pages 1 à 5
qpdf
# Fusionner des pages PDFqpdf --empty --pages file1.pdf file2.pdf -- merged.pdf# Diviser les pages
qpdf input.pdf --pages . 1-5 -- pages1-5.pdf
qpdf input.pdf --pages . 6-10 -- pages6-10.pdf# Faire pivoter les pages
qpdf input.pdf output.pdf --rotate=+90:1 # Faire pivoter la page 1 de 90 degrés# Supprimer le mot de passe
qpdf --password=mypassword --decrypt encrypted.pdf decrypted.pdf
pdftk (si disponible)
# Fusionner
pdftk file1.pdf file2.pdf cat output merged.pdf# Diviser
pdftk input.pdf burst# Faire pivoter
pdftk input.pdf rotate 1east output rotated.pdf
Tâches courantes
Extraire du texte à partir d’ PDFs numérisées
# Pré-requis : pip install pytesseract pdf2image
import pytesseract
from pdf2image import convert_from_path# Convertir des fichiers « PDF » en images
images = convert_from_path('scanned.pdf')# Effectuer la reconnaissance optique de caractères (OCR) sur chaque 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)
Ajouter un filigrane
from pypdf import PdfReader, Pdf Writer# Créer un filigrane (ou charger un filigrane existant)
watermark = PdfReader("watermark.pdf").pages[0]# Appliquer à toutes les pages
reader = PdfReader("document.pdf")
writer = PdfWriter()for page in reader.pages:
page.merge_page(filigrane)
writer.add_page(page)with open("watermarked.pdf", "wb") as output:
writer.write(output)
Extraire les images
# Utilisation de la commande « pdf» (poppler-utils)
pdfimages -j input.pdf output_prefix# Cela extrait toutes les images sous la forme output_prefix-000.jpg, output_prefix-001.jpg, etc.
Protection par mot de passe
from pypdf import PdfReader, PdfWriterreader = PdfReader("input.pdf")
writer = PdfWriter()for page in reader.pages:
writer.add_page(page)# Ajouter un mot de passe
writer.encrypt("userpassword", "ownerpassword")with open("encrypted.pdf", "wb") as output:
writer.write(output)
Référence rapide
Étapes suivantes
- Pour une utilisation avancée de pypdfium2, consultez REFERENCE.md
- Pour les bibliothèques JavaScript (pdf-lib), consultez REFERENCE.md
- Si vous devez remplir un formulaire d'PDF, suivez les instructions fournies dans FORMS.md
- Pour les guides de dépannage, consultez REFERENCE.md
PDF Processing Guide
Overview
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.
Quick Start
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 Libraries
pypdf - Basic Operations
Merge PDFs
from pypdf import PdfWriter, PdfReaderwriter = 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)
Split 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)
Extract Metadata
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}")
Rotate Pages
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 - Text and Table Extraction
Extract Text with Layout
import pdfplumberwith pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
text = page.extract_text()
print(text)
Extract Tables
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)
Advanced Table Extraction
import pandas as pdwith 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 - Create PDFs
Basic PDF Creation
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvasc = 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()
Create PDF with Multiple Pages
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak
from reportlab.lib.styles import getSampleStyleSheetdoc = 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)
Subscripts and Superscripts
IMPORTANT: Never use Unicode subscript/superscript characters (₀₁₂₃₄₅₆₇₈₉, ⁰¹²³⁴⁵⁶⁷⁸⁹) in ReportLab PDFs. The built-in fonts do not include these glyphs, causing them to render as solid black boxes.
Instead, use ReportLab's XML markup tags in Paragraph objects:
from reportlab.platypus import Paragraph
from reportlab.lib.styles import getSampleStyleSheetstyles = 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'])
For canvas-drawn text (not Paragraph objects), manually adjust font the size and position rather than using Unicode subscripts/superscripts.
Command-Line Tools
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 (if available)
# Merge
pdftk file1.pdf file2.pdf cat output merged.pdf# Split
pdftk input.pdf burst# Rotate
pdftk input.pdf rotate 1east output rotated.pdf
Common Tasks
Extract Text from Scanned PDFs
# 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)
Add Watermark
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)
Extract Images
# Using pdfimages (poppler-utils)
pdfimages -j input.pdf output_prefix# This extracts all images as output_prefix-000.jpg, output_prefix-001.jpg, etc.
Password Protection
from pypdf import PdfReader, PdfWriterreader = 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)
Quick Reference
Next Steps
- For advanced pypdfium2 usage, see REFERENCE.md
- For JavaScript libraries (pdf-lib), see REFERENCE.md
- If you need to fill out a PDF form, follow the instructions in FORMS.md
- For troubleshooting guides, see REFERENCE.md
Installer pdf
Téléchargez et décompressez les fichiers de compétences dans votre répertoire .claude/skills/.
Télécharger le ZIPClonez le dépôt et copiez les fichiers de compétence dans votre projet.
git clone https://github.com/anthropics/skills/tree/main/skills/pdf # Copy the skill folder to .claude/skills/ or .codex/skills/
Copier





Maison
