Biblioteca gratuita de PDF en C++ para leer y escribir archivos PDF
Una biblioteca PDF simple y de código abierto basada en C permite leer, escribir y manipular documentos PDF. Soporta la conversión de imagen a PDF, la extracción de contenidos, la lectura de PDF basada en streams y más, dentro de aplicaciones en C.
¿Qué es la biblioteca PDFio?
PDFio es una biblioteca C ligera y de código abierto diseñada específicamente para leer y escribir archivos PDF sin la complejidad del renderizado o la visualización. Creada por Michael R Sweet y licenciada bajo la Licencia Apache Versión 2.0, esta biblioteca ofrece a los desarrolladores un enfoque sencillo para la manipulación de PDF que se centra en la creación, extracción y transformación de contenido, más que en la presentación visual. La biblioteca es muy fácil de manejar y proporciona varias formas de procesar archivos PDF, como la extracción y fusión de páginas PDF, generación automática de informes a partir de bases de datos, marcas de agua y sellado, creación de certificados y diplomas, incrustación de fuentes para archivado, modificación de metadatos y mucho más.
PDFio se centra en las operaciones de E/S esenciales, lo que lo hace perfecto para aplicaciones que necesitan extraer datos de PDFs o crear nuevos sin la sobrecarga de bibliotecas más complejas. La biblioteca admite potentes funciones de conversión y permite a los desarrolladores de software convertir markdown a PDF, imagen a PDF, HTML a PDF, así como generar códigos de barras en PDFs dentro de aplicaciones C. Su enfoque en la funcionalidad central sin la sobrecarga de renderizado lo hace ideal para aplicaciones del lado del servidor, herramientas de línea de comandos y sistemas embebidos donde se necesita crear o procesar PDFs sin visualización. Ya sea que estés construyendo sistemas de gestión documental, creando generadores de informes automatizados o desarrollando herramientas para el análisis de PDFs, PDFio ofrece la funcionalidad esencial necesaria para el manejo profesional de PDFs en aplicaciones C.
Comenzando con PDFio
La forma recomendada de instalar PDFio es usando NuGet. Por favor, usa el siguiente comando para una instalación sin problemas.
Instalar PDFio vía NuGet
Install-Package pdfio_native Instalar PDFio vía GitHub
git clone https://github.com/michaelrsweet/pdfio.git
También puedes instalarlo manualmente; descarga los archivos de la última versión directamente del repositorio GitHub.
Crear un PDF desde cero con C
La biblioteca de código abierto PDFio ha incluido soporte completo para crear nuevos documentos PDF desde cero dentro de aplicaciones C. Crear un nuevo documento PDF es igualmente sencillo y, con solo un par de líneas de código C, los desarrolladores de software pueden agregar nuevas páginas, dibujar texto y formas simples, añadir imágenes (formatos JPEG, PNG), aplicar colores y transformaciones, construir tablas y diseños estructurados y mucho más. Aquí hay un ejemplo simple que demuestra cómo crear
¿Cómo convertir una sola imagen a PDF mediante una biblioteca C?
#include
#include
#include
bool create_pdf_from_image(const char *image_path,
const char *pdf_path,
const char *title) {
pdfio_file_t *pdf;
pdfio_obj_t *image;
pdfio_dict_t *page_dict;
pdfio_stream_t *page_stream;
pdfio_rect_t media_box;
double img_width, img_height;
double page_width, page_height;
double scale_x, scale_y, scale;
double x, y;
// Create the image object first to get dimensions
// We'll use a temporary PDF for this
pdfio_rect_t temp_box = {0, 0, 612, 792};
pdf = pdfioFileCreate(pdf_path, "2.0", &temp_box, NULL, NULL, NULL);
if (!pdf) {
fprintf(stderr, "Error: Cannot create PDF file\n");
return false;
}
// Set PDF metadata
if (title) {
pdfioFileSetTitle(pdf, title);
}
pdfioFileSetAuthor(pdf, "PDFio Image Converter");
pdfioFileSetCreator(pdf, "image2pdf v1.0");
// Load and embed the image
image = pdfioFileCreateImageObjFromFile(pdf, image_path, true);
if (!image) {
fprintf(stderr, "Error: Cannot load image file: %s\n", image_path);
pdfioFileClose(pdf);
return false;
}
// Get image dimensions in pixels
img_width = pdfioImageGetWidth(image);
img_height = pdfioImageGetHeight(image);
printf("Image dimensions: %.0f x %.0f pixels\n", img_width, img_height);
// Create page sized to image (assuming 72 DPI)
// This creates a PDF page that exactly fits the image
page_width = img_width;
page_height = img_height;
media_box.x1 = 0.0;
media_box.y1 = 0.0;
media_box.x2 = page_width;
media_box.y2 = page_height;
// Create page dictionary and add image resource
page_dict = pdfioDictCreate(pdf);
pdfioDictSetRect(page_dict, "MediaBox", &media_box);
pdfioPageDictAddImage(page_dict, "IM1", image);
// Create the page
page_stream = pdfioFileCreatePage(pdf, page_dict);
// Draw image at full size (no scaling)
pdfioContentDrawImage(page_stream, "IM1", 0, 0,
page_width, page_height);
// Close and save
pdfioStreamClose(page_stream);
pdfioFileClose(pdf);
printf("Successfully created PDF: %s\n", pdf_path);
return true;
}
int main(int argc, char *argv[]) {
if (argc < 3) {
fprintf(stderr, "Usage: %s [title]\n",
argv[0]);
return 1;
}
const char *title = (argc > 3) ? argv[3] : NULL;
if (!create_pdf_from_image(argv[1], argv[2], title)) {
return 1;
}
return 0;
}
Leer PDF y extraer texto mediante la biblioteca C
Una de las tareas más comunes es leer y extraer texto de un archivo PDF. La biblioteca de código abierto PDFio hace que este proceso sea intuitivo al permitir a los desarrolladores iterar a través de las páginas y sus flujos de contenido. La biblioteca ofrece soporte completo para extraer información útil de PDFs existentes, como texto simple, metadatos, fuentes incrustadas, números, imágenes, uvas, nombres y más. El siguiente ejemplo muestra cómo abrir un PDF existente y extraer información básica del mismo usando la biblioteca C.
¿Cómo extraer texto simple de un archivo PDF mediante una biblioteca C?
#include
#include
#include
// Callback function to handle text objects
static bool text_cb(const pdfio_text_t *text, void *data) {
// Simply print the text to stdout
printf("%s", text->utf8);
return true;
}
int main(void) {
pdfio_file_t *pdf;
pdfio_page_t *page;
// Open the PDF file for reading
pdf = pdfioFileOpen("example.pdf", NULL, NULL, NULL);
if (!pdf) {
fprintf(stderr, "Failed to open example.pdf\n");
return 1;
}
printf("PDF has %d pages.\n", pdfioFileGetNumPages(pdf));
// Read the first page (pages are 1-indexed)
page = pdfioFileGetPage(pdf, 1);
if (!page) {
fprintf(stderr, "Failed to read page 1\n");
pdfioFileClose(pdf);
return 1;
}
// Parse the page content and call our text_cb for each text object
if (!pdfioPageParseContents(page, text_cb, NULL, NULL, NULL)) {
fprintf(stderr, "Failed to parse page contents\n");
}
// Clean up
pdfioFileClose(pdf);
return 0;
}
Lectura eficiente basada en flujos
PDFio está diseñada para la eficiencia. Al leer, no carga todo el archivo en memoria de una sola vez. En su lugar, utiliza un enfoque de análisis por extracción (pull-parsing), lo que permite procesar el archivo en fragmentos. Esto es crucial para manejar PDFs muy grandes sin agotar la memoria del sistema. La función pdfioPageParseContents del primer ejemplo es un ejemplo destacado de este modelo basado en flujos. Lee el flujo de contenido de la página de forma secuencial, emitiendo eventos (como nuestra devolución de llamada de texto) a medida que avanza.