텍스트 편집
PDF Oxide는 PdfPage 객체를 통한 DOM 스타일 텍스트 편집을 제공합니다. 텍스트 요소를 쿼리하고, 콘텐츠를 수정하고, 변경 사항을 PDF에 다시 저장할 수 있습니다. 모든 텍스트 요소는 콘텐츠, 폰트 메타데이터, 바운딩 박스, 위치 지정에 접근할 수 있는 PdfText 노드로 표현됩니다.
페이지 가져오기
Python
from pdf_oxide import PdfDocument
doc = PdfDocument("input.pdf")
page = doc.page(0) # Get page at index 0
Rust
Pdf API를 사용합니다:
use pdf_oxide::api::Pdf;
let mut doc = Pdf::open("input.pdf")?;
let page = doc.page(0)?;
또는 DocumentEditor를 직접 사용합니다:
use pdf_oxide::editor::DocumentEditor;
let mut editor = DocumentEditor::open("input.pdf")?;
let page = editor.get_page(0)?;
텍스트 찾기
find_text_containing
특정 문자열을 포함하는 텍스트 요소를 검색합니다.
page = doc.page(0)
texts = page.find_text_containing("Hello")
for t in texts:
print(f"Found: '{t.value}' at {t.bbox}")
let page = doc.page(0)?;
let texts = page.find_text_containing("Hello");
for t in &texts {
println!("Found: '{}' at {:?}", t.text(), t.bbox());
}
find_text (Rust 전용)
더 유연한 매칭을 위해 커스텀 술어로 검색합니다.
// Find all bold text larger than 14pt
let headings = page.find_text(|t| t.is_bold() && t.font_size() > 14.0);
for h in &headings {
println!("Heading: {}", h.text());
}
// Find text by font name
let courier_text = page.find_text(|t| t.font_name().contains("Courier"));
텍스트 수정
set_text
ID로 텍스트 요소의 콘텐츠를 교체합니다.
page = doc.page(0)
for t in page.find_text_containing("DRAFT"):
page.set_text(t.id, "FINAL")
doc.save_page(page)
doc.save("output.pdf")
let mut page = doc.page(0)?;
let drafts = page.find_text_containing("DRAFT");
for t in &drafts {
page.set_text(t.id(), "FINAL")?;
}
doc.save_page(page)?;
doc.save("output.pdf")?;
modify_text (Rust 전용)
전체 PdfText API에 접근하여 텍스트 요소를 제자리에서 수정하는 클로저를 적용합니다.
let mut page = doc.page(0)?;
let texts = page.find_text_containing("price");
for t in &texts {
page.modify_text(t.id(), |text| {
let old = text.text().to_string();
let new = old.replace("$9.99", "$12.99");
text.set_text(new);
})?;
}
doc.save_page(page)?;
PdfText 속성
모든 PdfText 요소는 속성에 대한 읽기 접근을 제공합니다.
Python
page = doc.page(0)
for t in page.find_text_containing(""):
print(f"Text: {t.value}")
print(f"Font: {t.font_name} {t.font_size}pt")
print(f"Bold: {t.is_bold}, Italic: {t.is_italic}")
print(f"BBox: {t.bbox}")
print(f"Contains 'hello': {t.contains('hello')}")
print(f"Starts with 'A': {t.starts_with('A')}")
print(f"Ends with '.': {t.ends_with('.')}")
Rust
let page = doc.page(0)?;
for t in &page.find_text_containing("") {
println!("Text: {}", t.text());
println!("Font: {} {:.1}pt", t.font_name(), t.font_size());
println!("Bold: {}, Italic: {}", t.is_bold(), t.is_italic());
println!("BBox: {:?}", t.bbox());
println!("Color: {:?}", t.color());
// String operations
println!("Contains 'hello': {}", t.contains("hello"));
println!("Starts with 'A': {}", t.starts_with("A"));
println!("Ends with '.': {}", t.ends_with("."));
println!("Empty: {}", t.is_empty());
println!("Length: {}", t.len());
}
전체 PdfText API (Rust)
콘텐츠 메서드
| 메서드 | 반환값 | 설명 |
|---|---|---|
text() |
&str |
텍스트 콘텐츠 가져오기 |
value() |
&str |
text()의 별칭 |
set_text(new_text) |
() |
텍스트 콘텐츠 교체 |
set_value(new_text) |
() |
set_text()의 별칭 |
append(text) |
() |
끝에 텍스트 추가 |
replace(old, new) |
usize |
일치 항목 교체, 개수 반환 |
clear() |
() |
모든 텍스트 콘텐츠 제거 |
is_empty() |
bool |
텍스트가 비어 있는지 확인 |
len() |
usize |
텍스트 길이 가져오기 |
contains(needle) |
bool |
텍스트에 부분 문자열이 포함되는지 확인 |
starts_with(prefix) |
bool |
접두사 확인 |
ends_with(suffix) |
bool |
접미사 확인 |
폰트 및 스타일 메서드
| 메서드 | 반환값 | 설명 |
|---|---|---|
font_name() |
&str |
PostScript 폰트 이름 |
font_size() |
f32 |
글꼴 크기(포인트) |
is_bold() |
bool |
굵게 여부 확인 |
is_italic() |
bool |
기울임꼴 여부 확인 |
color() |
Color |
텍스트 색상 |
set_style(style) |
() |
텍스트 스타일 설정 |
위치 및 변환 메서드
| 메서드 | 반환값 | 설명 |
|---|---|---|
id() |
ElementId |
고유 요소 식별자 |
bbox() |
Rect |
바운딩 박스 |
origin() |
Option<Point> |
텍스트 원점 |
set_origin(point) |
() |
텍스트 원점 설정 |
rotation_degrees() |
Option<f32> |
회전 각도(도) |
rotation_radians() |
Option<f32> |
회전 각도(라디안) |
set_rotation(degrees) |
() |
회전 각도 설정 |
is_rotated() |
bool |
텍스트 회전 여부 확인 |
matrix() |
Option<[f32; 6]> |
변환 행렬 |
set_matrix(matrix) |
() |
변환 행렬 설정 |
고급 예제
모든 페이지에서 찾기 및 바꾸기
from pdf_oxide import PdfDocument
doc = PdfDocument("contract.pdf")
for i in range(doc.page_count()):
page = doc.page(i)
texts = page.find_text_containing("Acme Corp")
for t in texts:
page.set_text(t.id, "NewCo Inc.")
doc.save_page(page)
doc.save("contract-updated.pdf")
use pdf_oxide::api::Pdf;
let mut doc = Pdf::open("contract.pdf")?;
let count = doc.page_count()?;
for i in 0..count {
let mut page = doc.page(i)?;
let texts = page.find_text_containing("Acme Corp");
for t in &texts {
page.set_text(t.id(), "NewCo Inc.")?;
}
doc.save_page(page)?;
}
doc.save("contract-updated.pdf")?;
PageEditor 사용 (Rust)
PageEditor는 배치 편집 작업을 위한 fluent API를 제공합니다.
use pdf_oxide::editor::DocumentEditor;
let mut editor = DocumentEditor::open("input.pdf")?;
editor.edit_page(0, |page| {
let texts = page.find_text_containing("old");
for t in &texts {
page.set_text(t.id(), "new")?;
}
Ok(())
})?;
editor.save("output.pdf")?;
또는 컬렉션 기반 작업을 위해 PageEditor를 직접 사용합니다:
let mut editor = DocumentEditor::open("input.pdf")?;
let page = editor.page_editor(0)?
.find_text_containing("price")?
.for_each(|text| {
let old = text.text().to_string();
text.set_text(old.replace("$9.99", "$12.99"));
})?
.done()?;
editor.save_page_from_editor(page)?;
editor.save("output.pdf")?;
페이지에 새 텍스트 추가
page = doc.page(0)
text_id = page.add_text("CONFIDENTIAL", 100, 750, 24.0)
doc.save_page(page)
doc.save("stamped.pdf")
use pdf_oxide::elements::{FontSpec, TextContent, TextStyle};
let mut page = doc.page(0)?;
let content = TextContent {
text: "CONFIDENTIAL".to_string(),
bbox: pdf_oxide::geometry::Rect::new(100.0, 750.0, 200.0, 24.0),
font: FontSpec {
name: "Helvetica-Bold".to_string(),
size: 24.0,
},
style: TextStyle::default(),
reading_order: None,
origin: None,
rotation_degrees: None,
matrix: None,
};
let id = page.add_text(content);
doc.save_page(page)?;
텍스트 요소 제거
page = doc.page(0)
for t in page.find_text_containing("DELETE ME"):
page.remove_element(t.id)
doc.save_page(page)
doc.save("cleaned.pdf")
let mut page = doc.page(0)?;
let to_remove = page.find_text_containing("DELETE ME");
for t in &to_remove {
page.remove_element(t.id());
}
doc.save_page(page)?;
doc.save("cleaned.pdf")?;
수정된 페이지 저장
페이지의 텍스트를 수정한 후에는 save_page()를 호출하여 변경 사항을 유지해야 합니다. 이 호출이 없으면 수정 사항이 폐기됩니다.
page = doc.page(0)
page.set_text(text_id, "updated")
doc.save_page(page) # Persist page changes
doc.save("output.pdf") # Write to disk
let mut page = doc.page(0)?;
page.set_text(text_id, "updated")?;
doc.save_page(page)?; // Persist page changes
doc.save("output.pdf")?; // Write to disk