مكتبة C++ مجانية لتحويل صفحات PDF إلى صورة واستخراج النص.
مكتبة معالجة PDF مفتوحة المصدر بلغة C++ لتحويل صفحات PDF إلى صور، استخراج النص، التعامل مع ملفات PDF المحمية بكلمة مرور، والوصول إلى بيانات تعريف المستند عبر واجهة برمجة تطبيقات C++.
ما هو PDFium-Render؟
كان التعامل مع ملفات PDF وعرضها داخل تطبيق C++ تاريخيًا تحديًا معقدًا، غالبًا ما يتطلب تراخيص تجارية مكلفة أو أدوات مفتوحة المصدر مرهقة. هنا يأتي PDFium-Render، مكتبة غلاف حديثة للـ C++ تعتمد على ملفات الرأس فقط وتُجلب قوة محرك PDFium من جوجل إلى مشاريعك بواجهة بديهية ونظيفة. PDFium-render هو ربط آمن وإيديومي للغة Rust لمحرك PDFium، نفس محرك عرض PDF الذي يشغّل Google Chrome وMozilla Firefox. تم إنشاء هذه المكتبة وصيانتها بواسطة ajrcarey، وتوفر للمطورين مجموعة أدوات قوية لعرض صفحات PDF كصور، استخراج النص، تعديل هياكل PDF، والوصول إلى بيانات تعريف المستند—كل ذلك مع الاستفادة من ضمانات أمان الذاكرة في Rust.
على عكس العديد من مكتبات PDF التي تركز فقط على الإنشاء أو التحليل الأساسي، يتميز PDFium-Render بقدرته على عرض محتوى PDF بدقة بكسل مثالية، مما يجعله مثالياً للتطبيقات التي تحتاج إلى عرض أو تحويل أو معالجة مستندات PDF الحالية. يدعم مجموعة متنوعة من الميزات الأساسية والمتقدمة للعمل مع مستندات PDF، مثل عرض ملفات PDF والصفحات، استخراج النص وتحليله، العمل مع بيانات تعريف المستند، الوصول إلى كائنات الصفحة وتعديلها، التعامل مع ملفات PDF المحمية بكلمة مرور، وربما المزيد. إحدى أقوى نقاط القوة في pdfium-render هي دعمه المتعدد المنصات. تعمل المكتبة بسلاسة على Windows و macOS و Linux، مع تجريد الاختلافات الخاصة بالمنصة في ثنائيات PDFium. سواء كنت تبني عارض مستندات، أو تقوم بأتمتة سير عمل معالجة PDF، أو تستخرج البيانات من ملفات PDF، فإن pdfium-render يوفر الأدوات التي تحتاجها.
البدء مع PDFium-Render
الطريقة الموصى بها لتثبيت PDFium-Render هي استخدام CMake. يرجى استخدام الأمر التالي لتثبيت سلس.
تثبيت PDFium-Render عبر GitHub
vcpkg install pdfium-render
تثبيت PDFium-Render عبر GitHub
Git clone https://github.com/ajrcarey/pdfium-render.git يمكنك أيضًا تثبيتها يدويًا؛ قم بتنزيل أحدث ملفات الإصدار مباشرةً من مستودع GitHub.
عرض PDF عالي الدقة باستخدام C++
تكمن القوة الأساسية لمكتبة PDFium-Render المفتوحة المصدر في قدراتها على العرض. يمكنها تحويل صفحات PDF إلى صور نقطية بجودة استثنائية، وتدعم صيغ إخراج متعددة بما في ذلك PNG و JPEG و BMP. يتعامل محرك العرض مع ميزات PDF المعقدة مثل الشفافية، والتدرجات اللونية، والخطوط المدمجة، والرسومات المتجهة بنفس الدقة التي تتوقعها من عارض PDF في Chrome. إليك مثال بسيط يوضح كيف يمكن للمطورين تحويل صفحة محددة إلى صيغة صورة PNG داخل تطبيقات C++.
كيف تقوم بعرض صفحة PDF محددة بصيغة PNG باستخدام 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
)?;
//
كيف تستخرج النص من مناطق محددة في صفحة PDF باستخدام واجهة برمجة التطبيقات 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 مع PDF محمي بكلمة مرور باستخدام C++
الأمان أمر بالغ الأهمية عند التعامل مع المستندات. يتعامل PDFium-Render مع ملفات PDF المحمية بكلمة مرور بسلاسة، داعماً كلًا من كلمات مرور المستخدم والمالك. تتعامل المكتبة مع المصادقة بشكل شفاف، وتعيد الأخطاء المناسبة إذا كانت كلمة المرور غير صحيحة أو إذا كان ملف PDF يحتوي على قيود تمنع بعض العمليات. إليك مثال مفيد جدًا يوضح كيفية التعامل مع مستندات PDF المحمية بكلمة مرور داخل تطبيقات C++.
كيف تفتح وتحمّل مستندات PDF المحمية بكلمة مرور باستخدام واجهة برمجة التطبيقات 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(())
}
العمل على بيانات PDF الوصفية والخصائص باستخدام C++
فهم بنية ملف PDF أمر أساسي للعديد من التطبيقات. توفر مكتبة PDFium-Render المفتوحة المصدر وصولًا كاملاً إلى بيانات تعريف المستند، عدد الصفحات، الأبعاد، وغيرها من الخصائص. هذه الوظيفة لا تقدر بثمن في بناء أنظمة إدارة المستندات، مدققي صحة PDF، أو أي تطبيق يحتاج إلى تصنيف أو معالجة ملفات PDF بناءً على خصائصها. يوضح مثال الشيفرة التالي كيف يمكن للمبرمجين العمل مع بيانات تعريف مستندات PDF والوصول إلى مختلف الخصائص بسهولة.
كيف تتعامل مع بيانات تعريف مستندات PDF باستخدام واجهة برمجة التطبيقات 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(())
}