Podofo هي مكتبة C ++ مجانية للعمل مع تنسيق ملف PDF.
يوفر Podofo فئات لتحليل ملف PDF وتعديل محتواه في الذاكرة. يمكن كتابة التغييرات مرة أخرى إلى القرص بسهولة. إلى جانب PDF ، يوفر Podofo PODOFO أيضًا مرافق لإنشاء ملفات PDF الخاصة بك من نقطة الصفر. لا يدعم حاليًا تقديم محتوى PDF.
لبناء podofo lib ستحتاج إلى برنامج التحويل البرمجي C ++ 17 ، Cmake 3.16 والمكتبات التالية (الإصدارات الدنيا المبدئية المشار إليها):
بالنسبة للأدوات الأكثر شعبية ، يتطلب Podofo الإصدارات الدنيا التالية:
يتم اختباره بانتظام مع إصدارات IDE/Toolchains التالية:
اندلع دعم GCC 8.x مؤخرًا ، ولكن يمكن إعادة إدراجه.
مكتبة Podofo مرخصة بموجب الشروط LGPL 2.0 أو الأحدث. أدوات podofo مرخصة بموجب الشروط GPL 2.0 أو الأحدث.
من المعروف أن Podofo يجمع من خلال العديد من مديري الحزم (بما في ذلك apt-get و BREW و VCPKG و CONAN) ، ولديه تكامل مستمر في Ubuntu Linux و MacOS و Windows ، وقم بتمهيد مشروع CMAKE ، وبناء واختبار المكتبة. يوصى بشدة ببناء podofo باستخدام مديري الحزم.
هناك أيضًا منطقة ملعب في المستودع حيث يمكنك الوصول إلى تبعيات ما قبل المبنى لبعض البنى/أنظمة التشغيل الشائعة: الملعب هو الإعداد الموصى به لتطوير المكتبة وإعادة إنتاج الأخطاء ، في حين أنه لا ينصح بنشر تطبيقك باستخدام Podofo. إلقاء نظرة على readme هناك.
تحذير : من المعروف أن Podofo يعمل في كوسل أدوات متعددة الاستخدامات (مثل تطوير Android/iOS) ، ولكن قد لا يتم توفير الدعم في مثل هذه السيناريوهات. إذا قررت بناء تبعيات يدويًا ، يُفترض أنك تعرف كيفية هوية الاشتباكات/عدم التطابق الممكنة للمكتبة وكيفية التعامل مع المشكلات في التجميع/الارتباط التي يمكن أن تنشأ في نظامك.
من تشغيل الجذر المصدر:
sudo apt-get install -y libfontconfig1-dev libfreetype-dev libxml2-dev libssl-dev libjpeg-dev libpng-dev libtiff-dev libidn11-dev
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
قم بتثبيت المشروب ، ثم من تشغيل الجذر المصدر:
brew install fontconfig freetype openssl libxml2 jpeg-turbo libpng libtiff libidn cmake
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_FIND_FRAMEWORK=NEVER -DCMAKE_PREFIX_PATH=`brew --prefix` -DFontconfig_INCLUDE_DIR=`brew --prefix fontconfig`/include -DOPENSSL_ROOT_DIR=`brew --prefix openssl@3` ..
cmake --build . --config Debug
تثبيت كونان ، ثم من الجذر المصدر:
mkdir build
cd build
conan install ..
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
اتبع دليل VCPKG QuickStart لإعداد مستودع Package Manager أولاً. في Windows ، قد يكون من المفيد أيضًا تعيين متغير البيئة VCPKG_DEFAULT_TRIPLET إلى x64-windows لتثبيت التبعيات الافتراضية 64 بت وتحديد متغير VCPKG_INSTALLATION_ROOT مع موقع المستودع كما تم إنشاؤه في QuickStart.
ثم من الجذر الجذر المصدر:
vcpkg install fontconfig freetype libxml2 openssl libjpeg-turbo libpng tiff zlib
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=C:vcpkgscriptsbuildsystemsvcpkg.cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
PODOFO_BUILD_TEST : قم بإنشاء اختبارات الوحدة ، الافتراضية إلى True ؛
PODOFO_BUILD_EXAMPLES : قم بإنشاء الأمثلة ، الافتراضيات إلى True ؛
PODOFO_BUILD_UNSUPPORTED_TOOLS : قم بإنشاء أدوات podofo ، الافتراضية إلى false. انظر القسم ذي الصلة في ReadMe ؛
PODOFO_BUILD_LIB_ONLY : إذا كان ذلك صحيحًا ، فسيقوم بإنشاء مكون المكتبة فقط. هذا لا يشترك في اختبارات البناء والأمثلة والأدوات ؛
PODOFO_BUILD_STATIC : إذا كان هذا صحيحًا ، فقم ببناء المكتبة ككائن ثابت واستخدمها في الاختبارات والأمثلة والأدوات. بشكل افتراضي ، تم بناء مكتبة مشتركة.
إذا كنت ترغب في استخدام بناء ثابت من podofo وأنت تضمن مشروع Podofo Cmake ، فهذا أمر بسيط للغاية. افعل شيئًا مثل ما يلي في مشروع Cmake الخاص بك:
set(PODOFO_BUILD_LIB_ONLY TRUE CACHE BOOL "" FORCE)
set(PODOFO_BUILD_STATIC TRUE CACHE BOOL "" FORCE)
add_subdirectory(podofo)
# ...
target_link_libraries(MyTarget podofo::podofo)
إذا كنت تربط بنية ثابتة مسبقة من podofo ، فهذا سيناريو يكون فيه الدعم محدودًا ، حيث من المفترض أن تكون قادرًا على تحديد الأخطاء وإصلاحها. الخطوات العامة هي:
PODOFO_STATIC إلى مشروعك ، أو قبل تضمين podofo.h ؛podofo.a ، podofo_private.a (أو podofo.lib ، podofo_private.lib مع msvc) وجميع المكتبات التابعة. يمكن العثور على وثائق API على https://podofo.github.io/podofo/documentation/.
المتطلب السابق : تأكد من تثبيت doxygen على جهازك. إذا لم يكن الأمر كذلك ، تفضل بزيارة موقع Doxygen الرسمي لتنزيله وتثبيته.
توليد الوثائق : بعد الانتهاء من عملية الإنشاء المفصلة في الفصل السريع للتطوير ، انتقل إلى الدليل الجذر لرمز مصدر Podofo. افتح محطة أو موجه الأوامر وقم بتشغيل الأمر التالي:
doxygen build/Doxyfile عرض الوثائق : بمجرد اكتمال توليد الوثائق ، ستجد دليل documentation يحتوي على الوثائق التي تم إنشاؤها. افتح index.html في متصفح الويب المفضل لديك لعرض وثائق API.
cd build/doxygen/documentation
open index.html تهدف جميع std::strings أو std::string_view في المكتبة إلى الاحتفاظ بمحتوى السلسلة المشفرة UTF-8. PdfString و PdfName يقبلون السلاسل المشفرة UTF-8 بشكل افتراضي (تقبل PdfName الأحرف فقط في مجموعة char PdfDocEncoding ، على الرغم من). charbuff ABD bufferview بدلاً من ذلك يمثل مخزن المؤقت Octet عام.
يحتوي Podofo على واجهة برمجة تطبيقات غير مستقرة وهي نتيجة لمراجعة API واسعة النطاق لـ Podofo 0.9.x. في هذا الرابط ، يمكنك العثور على دليل غير مكتمل على ترحيل رمز 0.9.8 إلى 0.10.0. من المتوقع أن تتقارب Podofo مع واجهة برمجة تطبيقات مستقرة بمجرد اكتمال عملية المراجعة. انظر استقرار API لمزيد من التفاصيل.
تحذير : الأدوات حاليًا غير مدعومة وغير مختبرة وغير محافظة .
لا تزال أدوات Podofo متوفرة في شجرة المصدر ، لكن تجميعها معاق افتراضيًا لأنها غير سطحية/غير محفوظة ، ولن تتلقى الدعم حتى يتم مسح حالتها. لا ينصح بإدراجها في توزيعات البرامج. إذا كنت ترغب في بنائها ، فتأكد من محاذاة مشروع CMake باستخدام -DPODOFO_BUILD_UNSUPPORTED_TOOLS=TRUE . يتم تمكين الأدوات بشكل مريح في الملعب على الأقل لضمان عدم تغيير تغييرات المكتبة.
هناك قائمة TODO ، أو إلقاء نظرة على تعقب القضية.
س: كيف يمكنني التوقيع على وثيقة؟
ج: يوفر Podofo Head الآن إجراء توقيع عالي المستوى وهو قوي للغاية والذي يسمح بتوقيع مستند دون الحاجة إلى توفير هيكل CMS يدويًا. بشكل افتراضي ، فإنه يدعم توقيع وثيقة مع ملفات تعريف الامتثال PAdES-B الحديثة ، ولكن هناك أيضًا دعم لتوقيع PKCS7 Legacy. شريطة أن يكون لديك كل من شهادة X509 المشفرة ASN.1 ومفتاح RSA الخاص ، يمكنك توقيع مستند مع الرمز التالي:
auto inputOutput = std::make_shared<FileStreamDevice>(filepath, FileMode::Open);
PdfMemDocument doc;
doc.Load(inputOutput);
auto & page = doc.GetPages().GetPageAt( 0 );
auto & signature = page.CreateField<PdfSignature>( " Signature " , Rect ());
auto signer = PdfSignerCms(x509certbuffer, pkeybuffer);
PoDoFo::SignDocument (doc, *inputOutput, signer, signature);هناك أيضًا دعم لخدمات التوقيع الخارجية و/أو توقيع المستند في المخازن المؤقتة للذاكرة. انظر أمثلة التوقيع المختلفة في اختبارات الوحدة.
س: هل لا يزال بإمكاني استخدام إجراء قائم على الحدث للتوقيع على المستند؟
نعم ، لم يتغير إجراء المستوى القديم المنخفض ولا يزال متاحًا. لوصف الإجراء لفترة وجيزة ، يتعين على المرء تنفيذ PdfSigner بالكامل ، أو استرداد أو إنشاء حقل PdfSignature ، وإنشاء جهاز إخراج (انظر السؤال التالي) واستخدام PoDoFo::SignDocument(doc, device, signer, signature) . عند التوقيع ، يعمل تسلسل مكالمات PdfSignature بهذه الطريقة: الطريقة PdfSigner::Reset() تسمى أولاً ، ثم يتم استدعاء PdfSigner::ComputeSignature(buffer, dryrun) مع المخزن المؤقت الفارغ وحجة dryrun التي تم تعيينها على true . في هذه المكالمة ، يمكن للمرء فقط تغيير حجم المخزن المؤقت الذي يبالغ في تقدير الحجم المطلوب للتوقيع ، أو مجرد حساب توقيع مزيف يجب حفظه على المخزن المؤقت. ثم يتم استدعاء سلسلة من PdfSigner::AppendData(buffer) ، وتلقي جميع بيانات المستند المراد توقيعها. يتم استدعاء PdfSigner::ComputeSignature(buffer, dryrun) ، مع المعلمة dryrun التي تم تعيينها على false . تم مسح المخزن المؤقت في هذه المكالمة (لا يتم تغيير السعة) أو لا تدعو إلى قيمة PdfSigner::SkipBufferClear() .
س: PdfMemDocument::SaveUpdate() أو PoDoFo::SignDocument() اكتب ملفًا جزئيًا فقط: لماذا لا توجد آلية للتعامل مع التحديث الإضافي كما كان في Podofo 0.9.x؟ ما الذي يجب القيام به لتحديث/توقيع المستند بشكل صحيح؟
ج: الآلية السابقة في Podofo 0.9.x تتطلب تمكين الوثيقة للتحديثات الإضافية ، وهي خطوة قرار أعتقد أنه يجب أن تكون غير ضرورية. أيضًا:
استراتيجية بديلة توضح حقيقة أنه يجب إجراء التحديث الإضافي على نفس الملف من حيث تم تحميل المستند ، أو أن المخزن المؤقت الأساسي سوف ينمو استهلاكه في العيار بعد العمليات اللاحقة في حالة المستندات المحملة العازلة. يتبع بعض الأمثلة التي توضح العمليات الصحيحة لتحديث مستند ، تم تحميلها من الملف أو المخزن المؤقت:
auto inputOutput = std::make_shared<FileStreamDevice>(filename, FileMode::Open);
PdfMemDocument doc;
doc.Load(inputOutput);
doc.SaveUpdate(*inputOutput);charbuff outputBuffer;
FileStreamDevice input (filepath);
auto inputOutput = std::make_shared<BufferStreamDevice>(outputBuffer);
input.CopyTo(*inputOutput);
PdfMemDocument doc;
doc.Load(inputOutput);
doc.SaveUpdate(*inputOutput);يمكن إجراء المستندات التوقيع بنفس التقنية ، اقرأ الأسئلة الأخرى لمزيد من الأمثلة.
س: هل يمكنني توقيع وثيقة للمرة الثانية؟
ج: نعم ، يتم اختبار هذا ، ولكن للتأكد من أن هذا سيعمل على إعادة توهين الوثيقة مرة ثانية ، لأن إعادة استخدام المستند المحمّل بالفعل لا يزال غير اختبار (قد يتغير هذا لاحقًا). على سبيل المثال ، يمكنك القيام به كما يلي:
auto inputOutput = std::make_shared<FileStreamDevice>(filepath, FileMode::Open);
{
PdfMemDocument doc;
doc. Load (inputOutput);
auto & page = doc. GetPages (). GetPageAt ( 0 );
auto & signature = page. CreateField <PdfSignature>( " Signature1 " , Rect ());
PdfSignerCms signer (x509certbuffer, pkeybuffer);
PoDoFo::SignDocument (doc, *inputOutput, signer, signature);
}
{
PdfMemDocument doc;
doc. Load (inputOutput);
auto & page = doc. GetPages (). GetPageAt ( 0 );
auto & signature = page. CreateField <PdfSignature>( " Signature2 " , Rect ());
PdfSignerCms signer (x509certbuffer, pkeybuffer);
PoDoFo::SignDocument (doc, *inputOutput, signer, signature);
}قد يعمل بودوفو أو لا يعمل لتلبية احتياجاتك ويأتي بدون أي ضمان على الإطلاق. قد يتم إصلاح الأخطاء الخطيرة ، بما في ذلك عيوب الأمن ، في الأطر الزمنية التعسفية ، أو غير ثابتة على الإطلاق. يتم تحديد أولوية تنفيذ الميزات الجديدة وتحديد الأخطاء وفقًا لمصالح وتفضيلات الشخصية للمحامين. إذا كنت بحاجة إلى podofo لدمج ميزة أو إصلاح الأخطاء أمر بالغ الأهمية لسير العمل ، فإن أكثر النهج الترحيب والأسرع هو المساهمة بقع عالية الجودة.
يرجى الاشتراك في القائمة البريدية للمشروع والتي لا يزال يتبعها العديد من المطورين الأصليين في Podofo. تم إنشاء مجتمع Gitter أيضًا لتخفيف بعض الثرثرة غير الرسمية. إذا وجدت خطأً ومعرفة كيفية إصلاحه ، أو كنت ترغب في إضافة ميزة صغيرة ، فلا ترحب بإرسال طلب سحب ، مما يتبع نمط الترميز للمشروع. كحد أدنى مطلوب ، يجب أن تكون أي مساهمة:
قد تكون الأسباب الأخرى للرفض أو تعليق طلب السحب:
إذا كنت بحاجة إلى تنفيذ ميزة أو إعادة صياغة أكبر ، اسأل أولاً عما إذا كان قد تم التخطيط له بالفعل. قد تكون الميزة متروكة للاستيلاء ، مما يعني أنها مفتوحة للمساهمات الخارجية. يرجى الكتابة في القضية ذات الصلة التي بدأت في العمل على ذلك ، لتلقي بعض التعليقات/التنسيق. إذا لم يكن الأمر كذلك ، فهذا يعني أنه من المقرر تنفيذ إعادة التشغيل/الميزة لاحقًا من قبل المشرف (المشاريع). إذا لم يتم سرد الميزة في القضايا ، فأضفها و/أو إنشاء مناقشة لتلقي بعض التعليقات ومناقشة بعض خيارات التصميم الأساسية.
تحذير : من فضلك لا تستخدم عناوين البريد الإلكتروني الشخصية للدعم الفني Inquries ، ولكن إنشاء مشكلات github بدلاً من ذلك.
تم تطوير Podofo حاليًا من قبل Francesco Pretto ، إلى جانب دومينيك سيشتر وغيرها. راجع ملف uptors.md لمزيد من التفاصيل.