Biblioteca C++ gratuita para renderizar páginas PDF a imagen y extraer texto.
Biblioteca de procesamiento de PDF de código abierto en C++ para renderizar páginas PDF a imágenes, extraer texto, trabajar con PDFs protegidos con contraseña y acceder a los metadatos del documento mediante API C++.
¿Qué es PDFium-Render?
Manejar y renderizar PDFs dentro de una aplicación C++ ha sido históricamente un desafío complejo, a menudo involucrando licencias comerciales costosas o herramientas de código abierto engorrosas. Aparece PDFium-Render, una biblioteca moderna, solo de encabezados, de envoltorio C++ que lleva el poder del motor PDFium de Google a tus proyectos con una interfaz intuitiva y limpia. PDFium-render es un enlace seguro e idiomático de Rust para PDFium, el mismo motor de renderizado de PDF que impulsa Google Chrome y Mozilla Firefox. Creada y mantenida por ajrcarey, esta biblioteca brinda a los desarrolladores un conjunto de herramientas potente para renderizar páginas PDF a imágenes, extraer texto, manipular estructuras PDF y acceder a los metadatos del documento, todo mientras se aprovechan las garantías de seguridad de memoria de Rust.
A diferencia de muchas bibliotecas PDF que se centran únicamente en la creación o el análisis básico, PDFium-Render sobresale en la renderización de contenido PDF con precisión pixel-perfect, lo que lo hace ideal para aplicaciones que necesitan mostrar, convertir o procesar documentos PDF existentes. Soporta diversas funciones básicas y avanzadas para trabajar con documentos PDF, como renderizar archivos y páginas PDF, extracción y análisis de texto, trabajar con metadatos del documento, acceder y manipular objetos de página, trabajar con PDFs protegidos con contraseña, y más. Una de las mayores fortalezas de pdfium-render es su soporte multiplataforma. La biblioteca funciona sin problemas en Windows, macOS y Linux, abstraiendo las diferencias específicas de cada plataforma en los binarios de PDFium. Ya sea que estés construyendo un visor de documentos, automatizando flujos de trabajo de procesamiento de PDF o extrayendo datos de PDFs, pdfium-render proporciona las herramientas que necesitas.
Comenzando con PDFium-Render
La forma recomendada de instalar PDFium-Render es usando CMake. Por favor, utiliza el siguiente comando para una instalación sin problemas.
Instalar PDFium-Render a través de GitHub
vcpkg install pdfium-render
Instalar PDFium-Render a través de GitHub
Git clone https://github.com/ajrcarey/pdfium-render.git También puedes instalarlo manualmente; descarga los archivos de la última versión directamente del repositorio GitHub.
Renderizado de PDF de alta fidelidad mediante C++
La principal fortaleza de la biblioteca de código abierto PDFium-Render radica en sus capacidades de renderizado. Puede convertir páginas PDF en imágenes raster con una calidad excepcional, soportando varios formatos de salida, incluidos PNG, JPEG y BMP. El motor de renderizado maneja características complejas de PDF como transparencia, degradados, fuentes incrustadas y gráficos vectoriales con la misma precisión que esperas del visor de PDF de Chrome. Aquí hay un ejemplo sencillo que muestra cómo los desarrolladores de software pueden renderizar una página específica en formato de imagen PNG dentro de aplicaciones C++.
¿Cómo renderizar una página PDF específica en formato PNG mediante C++?
use pdfium_render::prelude::*;
fn render_pdf_page() -> Result<(), PdfiumError> {
// Initialize PDFium library
let pdfium = Pdfium::new(
Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name_at_path("./"))
.or_else(|_| Pdfium::bind_to_system_library())?
);
// Load a PDF document
let document = pdfium.load_pdf_from_file("sample.pdf", None)?;
// Get the first page
let page = document.pages().get(0)?;
// Render the page to a bitmap at 300 DPI
let bitmap = page.render_with_config(
&PdfRenderConfig::new()
.set_target_width(2480) // 300 DPI for 8.27 inches
.set_target_height(3508) // 300 DPI for 11.69 inches
)?;
// Save as PNG
bitmap.as_image().as_rgba8().unwrap()
.save("output.png")?;
Ok(())
}
Extracción y análisis de texto mediante la biblioteca C++
Más allá del renderizado, la biblioteca PDFium-Render ofrece capacidades integrales de extracción de texto. La API de extracción de texto es intuitiva y potente. Los desarrolladores de software pueden extraer texto de páginas individuales, buscar cadenas específicas e incluso acceder a información de posicionamiento a nivel de carácter con solo un par de líneas de código —crucial para implementar funciones como la selección o resaltado de texto. El siguiente ejemplo muestra cómo los desarrolladores de software pueden extraer texto de regiones específicas de páginas PDF dentro de aplicaciones C++.
¿Cómo extraer texto de regiones específicas de páginas PDF mediante la API de C++?
use pdfium_render::prelude::*;
fn extract_text_from_page() -> Result<(), PdfiumError> {
let pdfium = Pdfium::new(
Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name_at_path("./"))
.or_else(|_| Pdfium::bind_to_system_library())?
);
let document = pdfium.load_pdf_from_file("document.pdf", None)?;
let page = document.pages().get(0)?;
// Extract all text from the page
let text = page.text()?;
let all_text = text.all();
println!("Page text: {}", all_text);
// Search for specific text
let search_results = text.search("important", true, false)?;
for result in search_results {
println!("Found at index: {}", result.start_index());
}
// Get text in a specific rectangular area
let rect = PdfRect::new(100.0, 100.0, 300.0, 200.0);
let bounded_text = text.bounded(rect)?;
println!("Text in region: {}", bounded_text);
Ok(())
}
Word con PDF protegido por contraseña mediante C++
La seguridad es primordial al trabajar con documentos. PDFium-Render maneja PDFs protegidos con contraseña sin problemas, soportando tanto contraseñas de usuario como de propietario. La biblioteca gestiona la autenticación de forma transparente, devolviendo errores apropiados si la contraseña es incorrecta o si el PDF tiene restricciones que impiden ciertas operaciones. Aquí hay un ejemplo muy útil que muestra cómo manejar documentos PDF protegidos con contraseña dentro de aplicaciones C++.
¿Cómo abrir y cargar documentos PDF protegidos con contraseña mediante la API de C++?
fn open_encrypted_pdf() -> Result<(), PdfiumError> {
let pdfium = Pdfium::new(
Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name_at_path("./"))
.or_else(|_| Pdfium::bind_to_system_library())?
);
// Attempt to load with password
let document = pdfium.load_pdf_from_file(
"confidential.pdf",
Some("secret_password")
)?;
println!("Successfully opened encrypted PDF");
println!("Pages: {}", document.pages().len());
Ok(())
}
Trabajando con metadatos y propiedades de PDF mediante C++
Comprender la estructura de un PDF es esencial para muchas aplicaciones. La biblioteca de código abierto PDFium-Render proporciona acceso completo a los metadatos del documento, recuento de páginas, dimensiones y otras propiedades. Esta funcionalidad es invaluable para crear sistemas de gestión de documentos, validadores de PDF o cualquier aplicación que necesite categorizar o procesar PDFs basándose en sus propiedades. El siguiente ejemplo de código demuestra cómo los programadores pueden trabajar con los metadatos de documentos PDF y acceder a diversas propiedades con facilidad.
¿Cómo trabajar con los metadatos de documentos PDF mediante la API de C++?
fn inspect_document_metadata() -> Result<(), PdfiumError> {
let pdfium = Pdfium::new(
Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name_at_path("./"))
.or_else(|_| Pdfium::bind_to_system_library())?
);
let document = pdfium.load_pdf_from_file("report.pdf", None)?;
// Access document metadata
let metadata = document.metadata();
println!("Title: {}", metadata.title().unwrap_or("Untitled"));
println!("Author: {}", metadata.author().unwrap_or("Unknown"));
println!("Creator: {}", metadata.creator().unwrap_or("Unknown"));
println!("Producer: {}", metadata.producer().unwrap_or("Unknown"));
// Get page count
let page_count = document.pages().len();
println!("Total pages: {}", page_count);
// Inspect individual page properties
for (index, page) in document.pages().iter().enumerate() {
let width = page.width();
let height = page.height();
println!("Page {}: {}x{} points", index + 1, width.value, height.value);
}
Ok(())
}