حل مفتوح المصدر للإبلاغ عن الأتمتة

غالبًا ما يحتاج مطورو المواقع والتطبيقات المحمولة إلى التحكم في إعداد صفحات PDF لطباعتها أو إرسالها إلى العملاء عبر البريد.

تتمتع ملفات PDF بالتحكم الكامل في عرض النصوص والرسومات على الصفحة. لسوء الحظ ، لا يتم تضمين مكتبات إنشاء ملفات PDF التي يتم ملؤها ديناميكيًا في الأدوات القياسية لـ PHP أو JS (الويب) أو Java أو Swift (Android و iOS ، على التوالي). في هذه المقالة ، أود أن أخبركم عن الحل المفتوح المصدر لإنشاء ملفات PDF.



JasperReports هي مكتبة جافا مفتوحة المصدر لتوليد الملفات بالسكان بشكل ديناميكي. يحتوي على العديد من الأدوات لإنشاء نماذج تقارير معقدة ، بما في ذلك بتنسيق PDF ، ولكن التنسيقات الأخرى متوفرة أيضًا: RTF و DOCX و HTML و XLS و XLS و CSV و XML. بمعنى آخر ، يكفي تطوير نموذج واحد ، وإنشاء تخطيط واحد - وسيكون من الممكن تصديره إلى أي من التنسيقات المذكورة أعلاه.

هناك أيضًا مكتبات جيدة ، مثل PDFLib (الإصدار التجاري) لـ PHP وإصداره المفتوح المصدر من PDFLib-Lite. صحيح أن المكتبة باهظة الثمن ، ويتم توزيع الإصدار الخفيف فقط في الكود المصدري ، وعندما يتم تثبيته في بيئة التطوير ، يمكن أن يصبح هذا القيد مشكلة.

PDFbox هي مكتبة جافا مفتوحة المصدر أخرى للعمل مع مستندات PDF. يتيح لك إنشاء مستندات PDF جديدة ، وإدارة المستندات الحالية مع إمكانية استخراج المحتوى منها. لكنه لا يحتوي على واجهة مستخدم (واجهة المستخدم) ، على عكس JasperReports.

أعتقد أن JasperReports مفيد بشكل خاص في المشروعات الكبيرة المتعلقة بالإبلاغ وليس فقط بتنسيق PDF. لديه كل ما تحتاجه لتنفيذه في مشروعك: إنشاء بسيط لنماذج التقارير المعقدة ، واجهة المستخدم لتخطيط مناسب ، وتطبيق الخادم والتكامل البسيط مع الجبهة.

في المقالة سأغطي المواضيع التالية:

  • تثبيت بيئة التطوير وتطبيق الخادم.
  • قم بإنشاء ملف PDF يتم ملؤه تلقائيًا من قاعدة البيانات.
  • تكامل تطبيق الخادم مع الواجهة الأمامية للحصول على PDF الذي تم إنشاؤه.

لبدء استخدام JasperReports في مشروعك ، تحتاج إلى تنزيل تطبيقين: JaspersoftStudio - فيما بعد سوف نسميها بيئة العمل - و JasperServer - سوف نسمي تطبيق الخادم .

JaspersoftStudio هي بيئة تطوير تستند إلى Eclipse مع مكتبة Java المدمجة في JasperReports حيث يتم تطوير ملفات PDF الديناميكية أو الثابتة: على سبيل المثال ، التذاكر والإيصالات والعقود والمخططات التحليلية وغيرها.

JasperServer هو تطبيق خادم حيث يتم نشر الملفات وتخزينها من JaspersoftStudio. يمكن الوصول إليها من تطبيق الهاتف المحمول أو الويب. يشتمل JasperServer على واجهة مستخدم ، حيث يمكنك عرض التقارير وإنشاء حسابات لمستخدمين مختلفين ومنحهم حق الوصول المناسب. يمكنك أيضًا تكوين القائمة البريدية للبريد الإلكتروني (المجدول).

قم بإعداد بيئة العمل وتطبيق الخادم


يمكنك تنزيل وتثبيت التطبيقات باستخدام الروابط أعلاه. بعد إعداد تطبيقين ، من الضروري تأسيس اتصال من بيئة العمل إلى تطبيق الخادم.

الخوادم → إنشاء اتصال خادم JasperReports → حدد اسم الخادم المفضل وعنوان URL واسم المستخدم وكلمة المرور. انقر فوق اختبار الاتصال للتحقق من تأسيس الاتصال بالخادم. إذا رأيت ناجحًا - اذهب أبعد من ذلك.



قم بإنشاء ملف PDF مملوء ديناميكيًا وقم بنشره


قمنا بتثبيت بيئة التطوير ، والخادم وأقامنا اتصال بينهما. الآن دعنا ننشئ ملف PDF بدائيًا ممتلئًا بشكل ديناميكي ، والذي عندما يتم إطلاقه (سيتم إنشاؤه) سيأخذ البيانات من PostgreSQL ، ويثبته على تطبيق الخادم.

بادئ ذي بدء ، يجب عليك ربط مصدر البيانات (في حالتنا ، PostgreSQL) ببيئة العمل ، حيث سيأخذ PDF البيانات. ثم دعونا نبدأ في تطوير أول ملف PDF لدينا.

محولات البيانات ← إنشاء محول بيانات ← اتصال قاعدة بيانات JDBS وتحديد بيانات الاتصال:

  1. JDBC Driver - PostgreSQL (org.postgresql.Driver). إذا لم يكن هناك برنامج تشغيل لنظام إدارة قواعد البيانات لديك ، فيمكنك تثبيت برنامج التشغيل الضروري في علامة التبويب Driver Classpath.
  2. عنوان URL الخاص بـ JDBC - يتكون من اسم المضيف والمنفذ وقاعدة البيانات.
  3. اسم المستخدم وكلمة المرور - سجل تمرير من حساب DBMS الخاص بك.



نضغط على زر اختبار مألوف بالفعل لنا وعلى اتصال ناجح (ناجح) مع قاعدة البيانات - إنهاء .

من قاعدة البيانات هذه ، سيتم ملء ملف PDF في بيئة الإنتاج. نظرًا لأننا نخطط لنشر أول ملف بتنسيق PDF على الخادم أيضًا ، فلنربط مصدر البيانات نفسه في تطبيق الخادم:

مصادر البيانات → إضافة مصدر → مصدر البيانات وكرر كل شيء من النقطة أعلاه.

أنت الآن جاهز لإنشاء PDF. يتم تخزين المصادر في JasperReports بتنسيق JRXML - وهذا هو XML مع العلامات السلكية والسمات التي يعمل API JasperReports.

انقر فوق ملف ← جديد ← تقرير يشب ← فارغ A4 ← حدد اسم ملف JRXML ← إنهاء .



بعد إنشاء مشروع جديد ، سترى الصورة التالية:



سبع كتل مختلفة - كل كتلة لها سلوكها الخاص الذي يختلف عن الآخرين. يمكنك قراءة المزيد حول هذا في الوثائق . بالضغط على المصدر ، يمكنك رؤية هيكل هذه الكتل:

<?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Example" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="ae9517f6-ff0b-41bb-a8dc-82196190e940"> <queryString> <![CDATA[]]> </queryString> <background> <band splitType="Stretch"/> </background> <title> <band height="79" splitType="Stretch"/> </title> <pageHeader> <band height="35" splitType="Stretch"/> </pageHeader> <columnHeader> <band height="61" splitType="Stretch"/> </columnHeader> <detail> <band height="125" splitType="Stretch"/> </detail> <columnFooter> <band height="45" splitType="Stretch"/> </columnFooter> <pageFooter> <band height="54" splitType="Stretch"/> </pageFooter> <summary> <band height="42" splitType="Stretch"/> </summary> </jasperReport> 

لذلك ، دعونا إزالة خمس كتل إضافية وترك اثنين فقط: العنوان والتفاصيل. سيساعدنا زر الحذف (في Windows) أو Backspace (OS X) في ذلك.

الآن إضافة عنصرين. هناك طريقتان لإضافة عنصر جديد: قم بتسجيل الحاوية في بنية XML (زر المصدر ) أو اسحب العنصر المطلوب من نافذة Pallette العلوية اليمنى - نص ثابت ، حيث سيكون هناك أسماء الحقول وحقل النص ، حيث سنقوم بملء الحقول المتغيرة المسحوبة من قاعدة البيانات:

 <?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Example" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="ae9517f6-ff0b-41bb-a8dc-82196190e940"> <queryString> <![CDATA[]]> </queryString> <background> <band splitType="Stretch"/> </background> <title> <band height="30" splitType="Stretch"> <staticText> <reportElement x="0" y="0" width="100" height="30" uuid="7b697ed9-f52a-483c-965e-f0b2dc6130c1"/> <text> <![CDATA[Static Text]]> </text> </staticText> </band> </title> <detail> <band height="169" splitType="Stretch"> <textField> <reportElement x="0" y="0" width="100" height="20" uuid="41002e0b-ddb2-4e4b-a049-10810ab51208"/> <textFieldExpression> <![CDATA["Text Field"]]> </textFieldExpression> </textField> </band> </detail> </jasperReport> 

يمكن كتابة الاستعلام في قاعدة البيانات في علامة queryString أو النقر فوق زر الحوار DataSet and Query editor . بعد ذلك ، سيتم فتح نافذة جديدة حيث تحتاج إلى تحديد مصدر بيانات (1) ، كتابة استعلام (2) وإعلان متغيرات الحقل. سوف يقرأ زر قراءة الحقول (3) جميع الحقول تلقائيًا بناءً على طلب صحيح . لعرض البيانات ، انقر فوق معاينة البيانات (4).



! ممتاز لدينا أربعة حقول من النوع String ، والآن يمكننا إجراء أي تلاعب بها تقريبًا. على سبيل المثال ، نحن ببساطة نذكرهم ونكتب القليل من المنطق.

نقوم بطباعة أسماء الحقول المطلوبة في عناصر النص الثابت ووضعها في حاوية العنوان. سنشير إلى حقول متغيرة في عناصر حقل النص في حاوية التفاصيل ، لأنها سوف تتضاعف. سيقوم ملف PDF الخاص بنا بعرض الاسم والمدينة وعنوان البريد الإلكتروني. حتى لا تشعر بالملل التام ، دعنا نكتب منطقًا بسيطًا في عنصر حقل النص ، باستخدام الحقل الرابع - جنس العميل ، الجنس.

نقوم بما يلي: إذا كان العميل امرأة ، فستتم إضافة السيدة أمام الاسم ، إذا كان الرجل هو السيد. للقيام بذلك ، استخدم مشغل Java ternary:

 <textFieldExpression> <![CDATA[$F{sex}.equals( "male" )?"Mr. "+$F{name}:"Mrs. "+$F{name}]]> </textFieldExpression> 

بالضغط على معاينة بجوار زر المصدر ، يمكنك رؤية النتيجة:



كما ترون في لقطة الشاشة ، تم تجميع ملف PDF بنجاح: لقد استغرق كل القيم وطبق المنطق ، ووضع السيدة بشكل صحيح و السيد

سنحصل أيضًا على معلمة إدخال المدينة بحيث يمكن تصفية البيانات حسب المدينة. يمكن القيام بذلك إما عن طريق النقر فوق معلمات → إنشاء معلمة في إطار المخطط التفصيلي ، أو عن طريق إضافة علامة معلمة جديدة مع سمات الاسم والفئة:

 <parameter name="City" class="java.lang.String"/> 

يبقى فقط لإضافة المعلمة إلى استعلام SQL:

 SELECT Id, name, sex, city, email FROM users WHERE city = $P{City} 

نقوم بتمرير قيمة San Francisco إلى معلمة City (سأخبرك في الفقرة التالية عن كيفية القيام بذلك) وانقر فوق " معاينة البيانات" لعرض النتيجة.



تم جمع PDF عن طريق تصفية البيانات بنجاح. نذهب أبعد من ذلك

نظرًا لأن لدينا بالفعل ملف PDF ملئ ديناميكيًا ، يمكننا تحميله على الخادم لمزيد من التكامل مع تطبيقات الواجهة الأمامية الخاصة بنا. للقيام بذلك ، انقر فوق الزر نشر تقرير إلى خادم JasperReports Server ← انقر نقرًا مزدوجًا لفتح الخادم → حدد مجلد الخادم حيث يمكن تنزيل ملف PDF (في حالتنا ، تقارير ) ← التالي ← مصدر البيانات من السجل ← حدد مصدر البيانات الذي تم إنشاؤه مسبقًا على تطبيق الخادم ← إنهاء .

تكامل الواجهة الأمامية


تتضمن واجهة برمجة تطبيقات JasperReports تطبيق RESTful الخاص به للتفاعل بين عميل وخادم - REST v2 . إذا لم يناسبك ذلك ، يمكنك استخدام بروتوكول بسيط للوصول إلى الكائنات - SOAP .

سننظر في الإصدار الثاني من الإصدار REST.

الطرق الأربع الرئيسية لإجراءات CRUD (إنشاء-قراءة-تحديث-حذف) متوفرة: GET (get) ، POST (إضافة ، تغيير ، حذف) ، PUT (إضافة ، استبدال) ، حذف (حذف). جميع المعلومات التفصيلية متوفرة في الوثائق على الروابط أعلاه.

سننظر في طريقة GET الأكثر شيوعًا والأكثر صلة لهذه المقالة.

 http://<host>:<port>/jasperserver[pro]/rest_v2/reports/path/to/report.<format>?<arguments> 

أعلاه هو طلب متزامن ، يمكنك من خلاله الحصول على إخراج ملف (PDF جاهز) في استجابة واحدة لطلب (يمكن العثور على مكالمة غير متزامنة هنا ).

أعتقد أن كل شيء واضح مع المضيف والمنفذ ، و / التقارير / المسار / إلى / التقرير هو URI للملف الذي يتم استدعاؤه. نظرًا لأننا قمنا بنشر مصدر ملف PDF (Example.jrxml) في مجلد خادم التقارير ، فإن الإصدار الكامل من URI سيكون: / reports / reports / Example.

التنسيق هو تنسيق (في حالتنا ، PDF).
الحجج هي المعلمات.

أعلاه ، أضفنا المعلمة City ، وسنقوم بتمريرها في الطلب مع القيمة San Francisco لتصفية البيانات لهذه المدينة.

إذا لم تكن المكالمة من منطقة مصرح بها ، فستحتاج إلى إضافة معلمتين / وسمتين أخريين : j_username و j_password (تمرير السجل للترخيص). بشكل افتراضي ، اسم المستخدم وكلمة المرور على الخادم هو jasperadmin .

وبالتالي ، نحصل على عنوان URL التالي:

 http://localhost:8080/jasperserver/rest_v2/reports/reports/Example.PDF?city=San Francisco&j_username=jasperadmin&j_password=jasperadmin 

حتى نحصل على قوات الدفاع الشعبي التي تم إنشاؤها بالفعل. على سبيل المثال ، عند الاتصال بعنوان URL هذا من خلال شريط عنوان المتصفح ، يجب تنزيل الملف تلقائيًا.

قد تحتاج إلى عرض صورة PDF. على سبيل المثال ، إذا كان العميل يريد فقط عرض الملف ، فيمكنك إظهار المستند بتنسيق PNG ، إذا كنت ترغب في تنزيله ، ثم في PDF.

باستخدام Java كمثال باستخدام مكتبة PDFbox ، سننظر في كيفية إنشاء ملف PDF واختياره من تطبيق خارجي ، ثم تحويله إلى PNG.

يوجد أدناه فئة PullPDF باستخدام طريقة واحدة تأخذ عنوان URL كوسيطة.

 import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.URL; import java.util.Base64; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.tools.imageio.ImageIOUtil; public class PullPDF { public String ConvertPDF2PNG(String valuefromParam) throws IOException { BufferedInputStream input_file = new BufferedInputStream(new URL(valuefromParam).openStream()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { PDDocument document = PDDocument.load(input_file); PDFRenderer pdfRenderer = new PDFRenderer(document); for (int page = 0; page < document.getNumberOfPages(); ++page) { BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); ImageIOUtil.writeImage(bim, "png", baos); baos.flush(); byte[] encodedBytes = Base64.getEncoder().encode(baos.toByteArray()); valuefromParam = new String(encodedBytes); } } catch (Exception e) { } return valuefromParam; } } 

يمكنك الحصول على نفس النتيجة باستخدام ، على سبيل المثال ، إطار الربيع. لكنني حاولت إظهار طريقة عالمية يمكن تطبيقها على كل من Android والويب عند العمل مع Java.

استنتاج


إذا كنت تريد أتمتة إنشاء اختبار بسيط لمتجر على الإنترنت وكان لديك وقت محدود لإنشائه ، فنوصيك باستخدام الأدوات الأصلية لمشروعك أو الإطار المألوف. نظرًا لأن الوقت المستغرق في تثبيت JasperReports ، قد لا يكون هناك ما يبرر التعرف على الوثائق الخاصة بتطوير نماذج تقارير أكثر تعقيدًا. في حالات أخرى ، يعد JasperReports حلاً جيدًا مفتوح المصدر للإبلاغ عن التشغيل الآلي.

Source: https://habr.com/ru/post/ar461719/


All Articles