ספריית PDF חינמית ב-C++ לקריאה וכתיבה של קבצי PDF
ספרייה פשוטה וקוד פתוח מבוססת C ל-PDF מאפשרת קריאה, כתיבה וניהול של מסמכי PDF. היא תומכת בהמרת תמונה ל-PDF, חילוץ תוכן, קריאת PDF מבוססת זרם ועוד, בתוך אפליקציות C.
מהי ספריית PDFio?
PDFio היא ספריית C קלה, קוד פתוח, שנועדה במיוחד לקריאה וכתיבה של קבצי PDF ללא המורכבות של רינדור או צפייה. נוצרה על ידי מייקל אר. סוויט והועברה ברישיון Apache License Version 2.0, ספרייה זו מספקת למפתחים גישה פשוטה למניפולציה של PDF המתמקדת ביצירת תוכן, חילוץ והמרה במקום בתצוגה חזותית. הספרייה קלה מאוד לשימוש ומציעה מספר דרכים לעיבוד קבצי PDF כגון חילוץ ומיזוג דפי PDF, יצירת דוחות אוטומטיים ממסדי נתונים, הוספת סימני מים וחותמות, יצירת תעודות ותעודות סיום, הטמעת גופנים לשימור ארכיוני, שינוי מטה‑נתונים ועוד רבים.
PDFio מתמקדת בפעולות הקלט/פלט החיוניות, מה שהופך אותה למושלמת ליישומים שצריכים לחלץ נתונים מ‑PDFs או ליצור חדשים ללא העומס של ספריות מורכבות יותר. הספרייה תומכת בתכונות המרה חזקות ומאפשרת למפתחי תוכנה להמיר markdown ל‑PDF, תמונה ל‑PDF, HTML ל‑PDF וכן ליצור ברקודים ב‑PDFים בתוך יישומי C. ההתמקדות בפונקציונליות הליבה ללא עומס של רינדור עושה אותה אידיאלית ליישומי צד‑שרת, כלי שורת פקודה ומערכות משובצות שבהן נדרש יצירת או עיבוד PDF ללא תצוגה חזותית. בין אם אתם בונים מערכות ניהול מסמכים, יוצרים מחוללי דוחות אוטומטיים, או מפתחים כלים לניתוח PDF, PDFio מציעה את הפונקציונליות החיונית לטיפול מקצועי ב‑PDF ביישומי C.
התחלה עם PDFio
הדרך המומלצת להתקנת PDFio היא באמצעות NuGet. אנא השתמשו בפקודה הבאה להתקנה חלקה.
התקנת PDFio באמצעות NuGet
Install-Package pdfio_native התקנת PDFio באמצעות GitHub
git clone https://github.com/michaelrsweet/pdfio.git
אתה יכול גם להתקין זאת ידנית; הורד את קבצי השחרור האחרונים ישירות מGitHub מאגר.
יצירת PDF מאפס באמצעות C
ספריית הקוד הפתוח PDFio כוללת תמיכה מלאה ביצירת מסמך PDF חדש מאפס בתוך יישומי C. יצירת מסמך PDF חדש היא גם היא פשוטה, ועם רק כמה שורות קוד C מפתחים יכולים להוסיף דפים חדשים, לצייר טקסט וצורות פשוטות, להוסיף תמונות (בפורמטים JPEG, PNG), להחיל צבעים והמרות, לבנות
איך להמיר תמונה בודדת ל‑PDF באמצעות ספריית 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;
}
קריאת PDF והוצאת טקסט באמצעות ספריית C
אחת המשימות הנפוצות ביותר היא קריאה והוצאת טקסט מקובץ PDF. ספריית הקוד הפתוח PDFio עושה תהליך זה אינטואיטיבי על ידי מתן אפשרות למפתחים לעבור על דפים וזרמי התוכן שלהם. הספרייה מספקת תמיכה מלאה בחילוץ מידע שימושי מקבצי PDF קיימים, כגון טקסט פשוט, מטא‑נתונים, גופנים משובצים, מספרים, תמונות, ענבים, שמות ועוד. הדוגמה הבאה מדגימה כיצד לפתוח קובץ PDF קיים ולחלץ מידע בסיסי ממנו באמצעות ספריית C.
איך לחלץ טקסט פשוט מקובץ PDF באמצעות ספריית 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;
}
קריאה יעילה מבוססת זרם
PDFio תוכננה ליעילות. בעת קריאה, היא אינה טוענת את כל הקובץ לזיכרון בבת אחת. במקום זאת, היא משתמשת בגישה של משיכת ניתוח, המאפשרת לעבד את הקובץ בחלקים. זה קריטי לטיפול בקבצי PDF גדולים מאוד מבלי לרוקן את זיכרון המערכת. הפונקציה pdfioPageParseContents מהדוגמה הראשונה היא דוגמה מצוינת למודל מבוסס הזרם הזה. היא קוראת את זרם התוכן של הדף באופן רציף, ומשחררת אירועים (כמו קריאת הטקסט שלנו) תוך כדי תהליך.