use std::path::Path;
fn open_and_extract(path: &Path) -> pdfluent::Result<()> {
use pdfluent::PdfDocument;
let doc = PdfDocument::open("invoice.pdf")?;
let text = doc.extract_text()?;
println!("{text}");
for n in 0..doc.page_count() {
println!("--- page {} ---", n + 1);
println!("{}", doc.page(n)?.text()?);
}
let _ = (path, doc);
Ok(())
}
fn fill_xfa(path: &Path) -> pdfluent::Result<()> {
use pdfluent::PdfDocument;
let mut doc = PdfDocument::open("tax_return.pdf")?;
let model = doc.xfa_form_model()?;
for field in &model.fields {
println!("{} = {:?}", field.name, field.value);
}
doc.set_xfa_field_value("form1.name", pdfluent::xfa::XfaFieldValue::Text("Smith"))?;
let _ = path;
Ok(())
}
fn validate_pdfa(path: &Path) -> pdfluent::Result<()> {
use pdfluent::{PdfAProfile, PdfDocument};
let doc = PdfDocument::open("legacy.pdf")?;
let report = doc.validate_pdfa(PdfAProfile::A2b)?;
if report.is_compliant() {
println!("conforms to PDF/A-2b");
} else {
for violation in &report.violations {
println!("{violation:?}");
}
}
let _ = path;
Ok(())
}
fn main() {
let pad = Path::new("voorbeeld.pdf");
if std::env::var("PDFLUENT_SITE_SNIPPETS_RUN").is_ok() {
let _ = open_and_extract(pad);
let _ = fill_xfa(pad);
let _ = validate_pdfa(pad);
let _ = sign_pkcs12(pad);
let _ = verify_signatures(pad);
let _ = after_chrome(pad);
smoke_page_count();
let _ = open_and_count(pad);
quickstart_extract_text();
let _ = structured_extraction(pad);
let _ = text_and_merge(pad);
let _ = xfa_fill_and_flatten(pad);
let _ = pdfa_validate_and_convert(pad);
let _ = sign_and_verify(pad);
let _ = render_pages_to_png(pad);
} else {
println!(
"site_snippets: gebouwd, niet gedraaid (zet PDFLUENT_SITE_SNIPPETS_RUN om te draaien)"
);
}
}
fn sign_pkcs12(path: &Path) -> pdfluent::Result<()> {
use pdfluent::signer::{PadesProfile, Pkcs12Signer, SignOptions};
use pdfluent::PdfDocument;
let mut doc = PdfDocument::open("contract.pdf")?;
let signer = Pkcs12Signer::from_pfx_file("cert.p12", "password")?;
let opts = SignOptions::new()
.profile(PadesProfile::BasicSignature)
.reason("Approved");
doc.sign(&signer, opts)?;
doc.save("contract-signed.pdf")?;
let _ = path;
Ok(())
}
fn verify_signatures(path: &Path) -> pdfluent::Result<()> {
use pdfluent::signer::SignatureStatus;
use pdfluent::PdfDocument;
let doc = PdfDocument::open("signed.pdf")?;
let report = doc.verify_signatures()?;
for validation in report.validations() {
match &validation.status {
SignatureStatus::Valid => println!("Signature is valid"),
SignatureStatus::Invalid { reason } => println!("Signature is invalid: {reason}"),
SignatureStatus::Unknown { reason } => {
println!("Signature status is unknown: {reason}")
}
_ => println!("Signature status not recognised by this build"),
}
}
let _ = (path, doc);
Ok(())
}
fn after_chrome(path: &Path) -> pdfluent::Result<()> {
use pdfluent::{CompressOptions, PdfAProfile, PdfDocument, WatermarkOptions};
let mut doc = PdfDocument::open("out.pdf")?;
doc.add_watermark("DRAFT", WatermarkOptions::centered())?;
let report = doc.compress(CompressOptions::default())?;
println!("{} streams compressed", report.streams_compressed);
let archived = doc.convert_to_pdfa(PdfAProfile::A2b)?;
archived.save("invoice-archived.pdf")?;
let _ = path;
Ok(())
}
fn smoke_page_count() {
use pdfluent::PdfDocument;
fn main() -> pdfluent::Result<()> {
let doc = PdfDocument::open("invoice.pdf")?;
println!("{} pages", doc.page_count());
Ok(())
}
let _ = main();
}
fn open_and_count(path: &Path) -> pdfluent::Result<()> {
use pdfluent::PdfDocument;
let doc = PdfDocument::open("invoice.pdf")?;
println!("{} pages", doc.page_count());
let _ = (path, doc);
Ok(())
}
fn quickstart_extract_text() {
use pdfluent::PdfDocument;
fn main() -> pdfluent::Result<()> {
let doc = PdfDocument::open("invoice.pdf")?;
let text = doc.extract_text()?;
println!("{text}");
Ok(())
}
let _ = main();
}
fn structured_extraction(path: &Path) -> pdfluent::Result<()> {
use pdfluent::prelude::*;
let doc = PdfDocument::open("report.pdf")?;
let markdown = doc.extract_markdown(&ExtractOptions::default())?;
std::fs::write("report.md", &markdown).ok();
for block in doc.extract_blocks(&ExtractOptions::default())? {
if let BlockKind::Heading { level } = block.kind {
println!("h{level} p{} {}", block.page + 1, block.text);
}
}
let _ = (path, doc);
Ok(())
}
fn text_and_merge(path: &Path) -> pdfluent::Result<()> {
use pdfluent::{PdfDocument, PdfMerger};
let doc = PdfDocument::open("report.pdf")?;
for block in doc.text_with_layout()? {
let [x, y, _, _] = block.bbox;
println!("p{} [{x:.0},{y:.0}] {}", block.page, block.text);
}
let merged = PdfMerger::new()
.add(PdfDocument::open("part1.pdf")?)
.add(PdfDocument::open("part2.pdf")?)
.build()?;
merged.save("combined.pdf")?;
let _ = path;
Ok(())
}
fn xfa_fill_and_flatten(path: &Path) -> pdfluent::Result<()> {
use pdfluent::{PdfDocument, XfaFieldValue};
let mut doc = PdfDocument::open("tax_return.pdf")?;
let model = doc.xfa_form_model()?;
for f in &model.fields {
println!("{} = {:?} ({:?})", f.name, f.value, f.field_type);
}
let value = XfaFieldValue::Text("Alice Smith");
let outcome = doc.set_xfa_field_value("form1.applicant.name", value)?;
println!("persisted: {}", outcome.persisted_to_datasets);
doc.save("filed_return.pdf")?;
let _ = path;
Ok(())
}
fn pdfa_validate_and_convert(path: &Path) -> pdfluent::Result<()> {
use pdfluent::{PdfAProfile, PdfDocument};
let doc = PdfDocument::open("legacy.pdf")?;
let report = doc.validate_pdfa(PdfAProfile::A2b)?;
if !report.is_compliant() {
for v in &report.violations {
eprintln!("[{}] {} ({:?})", v.rule, v.message, v.severity);
}
}
let archived = doc.convert_to_pdfa(PdfAProfile::A2b)?;
archived.save("archived.pdf")?;
let _ = path;
Ok(())
}
fn sign_and_verify(path: &Path) -> pdfluent::Result<()> {
use pdfluent::{PadesProfile, PdfDocument, Pkcs12Signer, SignOptions};
let mut doc = PdfDocument::open("contract.pdf")?;
let signer = Pkcs12Signer::from_pfx_file("cert.p12", "password")?;
doc.sign(
&signer,
SignOptions::new()
.profile(PadesProfile::BasicSignature)
.reason("Approved by legal")
.location("Amsterdam, NL"),
)?;
doc.save("signed_contract.pdf")?;
let report = doc.verify_signatures()?;
for v in report.validations() {
println!("{}: {:?}", v.info.signer_name, v.status);
}
let _ = path;
Ok(())
}
fn render_pages_to_png(path: &Path) -> pdfluent::Result<()> {
use pdfluent::{ImageFormat, PdfDocument, ToImagesOptions};
let doc = PdfDocument::open("document.pdf")?;
let report = doc.to_images(
"page_{page}.png",
ToImagesOptions::new()
.with_dpi(150)
.with_format(ImageFormat::Png),
)?;
println!("{} pages rendered", report.paths.len());
let _ = path;
Ok(())
}