사용자가 PDF 파일과 관련된 작업을 수행하고자 할 때마다 이 기능을 활용하세요. 여기에는 PDF에서 텍스트나 표를 읽거나 추출하는 것, 여러 PDF를 하나로 결합하거나 병합하는 것, PDF를 분할하는 것, 페이지를 회전하는 것, 워터마크를 추가하는 것, 새로운 PDF를 생성하는 것, PDF 양식을 작성하는 것, PDF를 암호화하거나 복호화하는 것, 이미지를 추출하는 것, 스캔된 PDF에 OCR을 적용하여 검색 가능하게 만드는 것 등이 포함됩니다. 사용자가 .pdf 파일을 언급하거나 해당 파일을 생성해 달라고 요청할 경우, 이 스킬을 사용하십시오.
...모든 것을 확장하십시오PDF 처리 안내
개요
이 가이드는 Python 라이브러리와 명령줄 도구를 사용한 PDF 의 필수 처리 작업을 다룹니다. 고급 기능, JavaScript 라이브러리 및 자세한 예제는 REFERENCE.md를 참조하십시오. PDF 양식을 작성해야 하는 경우, FORMS.md를 읽고 해당 지침을 따르십시오.
빠른 시작
from pypdf import PdfReader, Pdf Writer# PDF 읽기
reader= PdfReader("document.pdf")
print(f"Pages: {len(reader.pages)}")# 텍스트 추출
text = ""
for page in reader.pages:
text += page.extract_text()
파이썬 라이브러리
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"제목: {meta.title}")
print(f"저자: {meta.author}")
print(f"주제: {meta.subject}")
print(f"제작자: {meta.creator}")
페이지 회전
reader = PdfReader("input.pdf")
writer = PdfWriter()page = reader.pages[0]
page.rotate(90) # 시계 방향으로 90도 회전
writer.add_page(page)with open("rotated.pdf", "wb") as output:
writer.write(output)
pdfplumber - 텍스트 및 표 추출
레이아웃을 활용한 텍스트 추출
import pdfplumberwith pdfplumber.open("document.pdf") as pdf:
for page in pdf.pages:
text = page.extract_text()
print(text)
표 추출
pdf를 사용하여 plumber.open("document.pdf") as pdf:
for i, page in enumerate(pdf.pages):
tables = page.extract_tables()
for j, table in enumerate(tables):
print(f" {i+1} 페이지의 { j+1 } 번째 표:")
for row in table:
print(row)
고급 표 추출
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: # 테이블이 비어 있지 않은지 확인
df = pd.DataFrame(table[1:], columns=table[0])
all_tables.append(df)# 모든 테이블 결합
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
# 텍스트 추가
c.drawString(100, height - 100, "Hello World!")
c.drawString(100, height - 120, "This is a PDF created with reportlab")# 선 추가
c.line(100, height - 140, 400, height - 140)# 저장
c.save()
여러 페이지로 구성된 ‘ PDF ’ 만들기
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 = []# 내용 추가
title = Paragraph("보고서 제목", styles['Title'])
story.append(title)
story.append(Spacer(1, 12))body = Paragraph("이것은 보고서의 본문입니다. " * 20, styles['Normal'])
story.append(body)
story.append(PageBreak())# 2페이지
story.append(Paragraph("2페이지", styles['Heading1']))
story.append(Paragraph("2페이지 내용", styles['Normal']))# 문서 생성 PDFdoc.build(story)
아래첨자 및 위첨자
중요: ReportLab PDF에서는 절대 유니코드 아래첨자/위첨자 문자(₀₁₂₃₄₅₆₇₈₉, ⁰¹²³⁴⁵⁶⁷⁸⁹)를 사용하지 마십시오. 내장 폰트에는 이러한 글리프가 포함되어 있지 않아, 검은색 사각형으로 렌더링됩니다.
대신, Paragraph 객체 내에서 ReportLab의 XML 마크업 태그를 사용하십시오:
from reportlab.platypus import Paragraph
from reportlab.lib.styles import getSampleStyleSheetstyles = getSampleStyleSheet()# 아래첨자: 태그 사용
chemical = Paragraph("H2O", styles['Normal'])# 위첨자: 태그를 사용하세요
squared = Paragraph("x2 +y2 ", styles['Normal'])
캔버스에 직접 그린 텍스트(Paragraph 객체가 아닌 경우)의 경우, 유니코드 아래첨자/위첨자를 사용하는 대신 글꼴 크기와 위치를 수동으로 조정하십시오.
명령줄 도구
pdftotext (poppler-utils)
# 텍스트 추출pdftext input.pdf output.txt# 레이아웃을 유지하며 텍스트 추출pdftext -layout input.pdf output.txt# 특정 페이지 추출pdftext -f 1 -l 5 input.pdf output.txt # 1~5페이지
qpdf
# PDF를 병합
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf# 페이지 분할
qpdf input.pdf --pages . 1-5 -- pages1-5.pdf
qpdf input.pdf --pages . 6-10 -- pages6-10.pdf# 페이지 회전
qpdf 입력.pdf 출력.pdf --rotate=+90:1 # 1페이지를 90도 회전# 암호 제거
qpdf --password=mypassword --decrypt encrypted.pdf decrypted.pdf
pdftk (사용 가능한 경우)
# 병합pdftk file1.pdf file2.pdf cat output merged.pdf# 분할pdftk input.pdf burst# 회전pdftk input.pdf rotate 1east output rotated.pdf
일반적인 작업
스캔된 이미지( PDF)에서 텍스트 추출
# 필요 조건: pip install pytesseract pdf2image
import pytesseract
from pdf2image import convert_from_path# PDF 를 이미지로 변환
images = convert_from_path('scanned.pdf')# 각 페이지에 대해 OCR 처리
text = ""
for i, image in enumerate(images):
text += f"페이지 {i+1}:\n"
text += pytesseract.image_to_string(image)
text += "\n\n"print(text)
워터마크 추가
from pypdf import PdfReader, Pdf Writer# 워터마크 생성 (또는 기존 워터마크 불러오기)
watermark = PdfReader("watermark.pdf").pages[0]# 모든 페이지에 적용
reader = PdfReader("document.pdf")
writer = PdfWriter()for page in reader.pages:
page.merge_page(워터마크)
writer.add_page(page)with open("watermarked.pdf", "wb") as output:
writer.write(output)
이미지 추출
# pdf이미지 추출 (poppler-utils)
pdfimages -j input.pdf output_prefix# 이 명령은 모든 이미지를 output_prefix-000.jpg, output_prefix-001.jpg 등의 형식으로 추출합니다.
비밀번호 보호
from pypdf import PdfReader, PdfWriterreader = PdfReader("input.pdf")
writer = PdfWriter()for page in reader.pages:
writer.add_page(page)# 암호 추가
writer.encrypt("userpassword", "ownerpassword")with open("encrypted.pdf", "wb") as output:
writer.write(output)
간편 참조
다음 단계
- pypdfium2의 고급 사용법에 대해서는 REFERENCE.md를 참조하십시오.
- JavaScript 라이브러리(pdf-lib)에 대해서는 REFERENCE.md를 참조하십시오
- PDF 양식을 작성해야 하는 경우, FORMS.md의 지침을 따르십시오
- 문제 해결 가이드에 대해서는 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





집
