साइटों और मोबाइल एप्लिकेशन के डेवलपर्स को अक्सर मेल द्वारा ग्राहकों को प्रिंट करने या भेजने के लिए पीडीएफ पृष्ठों की तैयारी को नियंत्रित करने की आवश्यकता होती है।
पीडीएफ फाइलों का पृष्ठ पर पाठ और ग्राफिक्स के प्रदर्शन पर पूर्ण नियंत्रण है। दुर्भाग्य से, गतिशील रूप से आबादी वाली पीडीएफ फाइलों को उत्पन्न करने के लिए पुस्तकालयों को पीएचपी, जेएस (वेब), जावा या स्विफ्ट (एंड्रॉइड और आईओएस, क्रमशः) के मानक टूल में शामिल नहीं किया गया है। इस लेख में मैं आपको पीडीएफ फाइलों को बनाने के लिए ओपन सोर्स समाधान के बारे में बताना चाहता हूं।
JasperReports गतिशील रूप से आबादी वाली फ़ाइलों को बनाने के लिए एक खुला स्रोत जावा पुस्तकालय है। इसमें पीडीएफ प्रारूप सहित जटिल रिपोर्टिंग फ़ॉर्म बनाने के लिए कई उपकरण हैं, लेकिन अन्य प्रारूप भी उपलब्ध हैं: आरटीएफ, डॉक्स, एचटीएमएल, एक्सएलएस, एक्सएलएस, सीएसवी और एक्सएमएल। दूसरे शब्दों में, यह एक रूप को विकसित करने, एक लेआउट बनाने के लिए पर्याप्त है - और इसे उपरोक्त किसी भी प्रारूप में निर्यात करना संभव होगा।
अच्छी लाइब्रेरी भी हैं, जैसे कि PHP के लिए PDFLib (वाणिज्यिक संस्करण) और PDFLib-Lite का इसका खुला स्रोत संस्करण। सच है, पुस्तकालय काफी महंगा है, और लाइट संस्करण केवल स्रोत कोड में वितरित किया जाता है, और जब इसे विकास के वातावरण में स्थापित किया जाता है, तो यह सीमा एक समस्या बन सकती है।
पीडीएफ दस्तावेजों के साथ काम करने के लिए पीडीएफबॉक्स एक अन्य खुला स्रोत जावा पुस्तकालय है। यह आपको नए पीडीएफ दस्तावेज़ बनाने की अनुमति देता है, उनमें से सामग्री निकालने की क्षमता के साथ मौजूदा दस्तावेजों का प्रबंधन करें। लेकिन इसमें जैस्पररपोर्ट्स के विपरीत यूआई (यूजर इंटरफेस) नहीं है।
मुझे लगता है कि JasperReports विशेष रूप से रिपोर्टिंग से संबंधित बड़ी परियोजनाओं में उपयोगी है और न केवल पीडीएफ प्रारूप में। आपके पास इसे अपने प्रोजेक्ट में लागू करने की जरूरत है: जटिल रिपोर्टिंग रूपों की सरल रचना, सुविधाजनक लेआउट के लिए यूआई, सर्वर अनुप्रयोग और सामने के साथ सरल एकीकरण।
लेख में मैं निम्नलिखित विषयों को शामिल करूंगा:
- विकास पर्यावरण और सर्वर अनुप्रयोग स्थापित करें।
- डेटाबेस से स्वचालित रूप से आबादी वाली एक पीडीएफ फाइल बनाएं।
- निर्मित पीडीएफ प्राप्त करने के लिए फ्रंट-एंड के साथ सर्वर एप्लिकेशन का एकीकरण।
अपने प्रोजेक्ट में JasperReports का उपयोग शुरू करने के लिए, आपको दो एप्लिकेशन डाउनलोड करने की आवश्यकता है: JaspersoftStudio - इसके बाद हम इसे
कार्यशील वातावरण कहेंगे - और JasperServer - हम
सर्वर एप्लिकेशन को कॉल करेंगे।
JaspersoftStudio बिल्ट-इन जैस्पररपोर्ट्स जावा लाइब्रेरी के साथ एक ग्रहण-आधारित विकास वातावरण है जहाँ डायनामिक या स्टैटिक पीडीएफ फाइलें विकसित की जाती हैं: उदाहरण के लिए, टिकट, रसीदें, अनुबंध, विश्लेषणात्मक चार्ट और अन्य।
JasperServer एक सर्वर एप्लिकेशन है जहां फाइलें तैनात की जाती हैं और
जसपर्सॉफ्ट स्टैडियो से संग्रहीत की जाती हैं। इन्हें मोबाइल या वेब एप्लिकेशन से एक्सेस किया जा सकता है। जैस्परसेवर में एक यूआई है, इसके साथ आप रिपोर्ट देख सकते हैं, विभिन्न उपयोगकर्ताओं के लिए खाते बना सकते हैं और उन्हें उपयुक्त एक्सेस दे सकते हैं। आप मेलिंग सूची को ईमेल (शेड्यूलर) में भी कॉन्फ़िगर कर सकते हैं।
काम के माहौल और सर्वर एप्लिकेशन को सेट करें
आप ऊपर दिए गए लिंक का उपयोग करके एप्लिकेशन डाउनलोड और इंस्टॉल कर सकते हैं। दो अनुप्रयोगों के सेटअप के बाद, कार्यशील वातावरण से सर्वर अनुप्रयोग के लिए कनेक्शन स्थापित करना आवश्यक है।
सर्वर → जैस्पररीपोर्ट सर्वर कनेक्शन बनाएँ → पसंदीदा सर्वर नाम,
URL , उपयोगकर्ता नाम और पासवर्ड निर्दिष्ट करें। यह सत्यापित करने के लिए कि सर्वर से कनेक्शन स्थापित है,
टेस्ट कनेक्शन पर क्लिक करें। यदि आप
सफल देखते हैं - और आगे बढ़ें।

डायनामिकली पॉपुलेटिंग पीडीएफ बनाएं और उसे प्रकाशित करें
हमने विकास पर्यावरण, सर्वर स्थापित किया और उनके बीच एक संबंध स्थापित किया। अब चलिए एक आदिम डायनामिकली पॉपुलेटिंग पीडीएफ फाइल बनाते हैं, जिसे जब लॉन्च किया जाता है (जेनरेट किया जाता है) तो पोस्टग्रेसीक्यूएल से डेटा लेगा, और इसे सर्वर एप्लिकेशन पर इंस्टॉल करेगा।
सबसे पहले, आपको काम के माहौल में डेटा स्रोत (हमारे मामले में, PostgreSQL) को फास्ट करना चाहिए, जहां से पीडीएफ डेटा ले जाएगा। तो फिर चलिए शुरू करते हैं अपनी पहली पीडीएफ फाइल को विकसित करने की।
डेटा एडेप्टर → डेटा एडेप्टर बनाएँ → डेटाबेस JDBS कनेक्शन और कनेक्शन डेटा निर्दिष्ट करें:
- JDBC ड्राइवर - PostgreSQL (org.postgresql.Driver)। यदि आपके DBMS के लिए कोई ड्राइवर नहीं है, तो आप ड्राइवर Classpath टैब में आवश्यक ड्राइवर स्थापित कर सकते हैं।
- JDBC URL - इसमें उनके होस्ट, पोर्ट और डेटाबेस का नाम होता है।
- उपयोगकर्ता नाम और पासवर्ड - अपने DBMS खाते से लॉग पास करें।

हम पहले से ही परिचित
टेस्ट बटन पर क्लिक करते हैं और डेटाबेस के साथ सफल कनेक्शन (सफल) पर
समाप्त करते हैं ।
इस डेटाबेस से, पीडीएफ उत्पादन वातावरण में आबाद हो जाएगा। चूंकि हम अपनी पहली पीडीएफ फाइल को सर्वर पर भी तैनात करने की योजना बना रहे हैं, आइए उसी डेटा स्रोत को सर्वर एप्लिकेशन पर स्क्रू करें:
डेटा स्रोत → संसाधन जोड़ें → डेटा स्रोत और उपरोक्त बिंदु से सब कुछ दोहराएं।
अब आप PDF बनाने के लिए तैयार हैं। जेस्परएक्सपोर्ट्स के स्रोत जेआरएक्सएमएल प्रारूप में संग्रहीत हैं - यह एक्सएमआर वायर्ड टैग्स और विशेषताओं के साथ है जो जैस्पररीपोर्ट्स एपीआई के साथ काम करता है।
फ़ाइल → नई → जैस्पर रिपोर्ट → ब्लैंक ए 4 → जेआरएक्सएमएल फ़ाइल का नाम निर्दिष्ट करें → फिनिश पर क्लिक करें ।

एक नई परियोजना बनाने के बाद, आप निम्न चित्र देखेंगे:

सात अलग-अलग ब्लॉक - प्रत्येक ब्लॉक का अपना व्यवहार होता है जो दूसरों से अलग होता है। आप
प्रलेखन में इसके बारे में अधिक पढ़ सकते हैं। स्रोत पर क्लिक करके आप इन ब्लॉकों की संरचना देख सकते हैं:
<?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>
तो, चलो पाँच अतिरिक्त ब्लॉक निकालें और केवल दो छोड़ें: शीर्षक और विवरण।
डिलीट बटन (विंडोज) या
बैकस्पेस (ओएस एक्स) हमें इसमें मदद करेगा।
अब दो तत्व जोड़ें। आप दो तरीकों से एक नया तत्व जोड़ सकते हैं: एक्सएमएल संरचना (
स्रोत बटन) में कंटेनर को पंजीकृत करें या ऊपरी दाईं ओर स्थित
पलेट विंडो से वांछित तत्व को खींचें - स्टेटिक टेक्स्ट, जहां फ़ील्ड नाम और पाठ फ़ील्ड होंगे, जिसके अंदर हम डेटाबेस से खींचे गए चर क्षेत्रों को भरेंगे:
<?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>
डेटाबेस में क्वेरी
क्वेरीस्ट्रिंग टैग में लिखी जा सकती है या
डेटासेट और क्वेरी संपादक संवाद बटन पर क्लिक कर सकती है। उसके बाद, एक नई विंडो खुल जाएगी जहां आपको डेटा स्रोत (1) का चयन करने की आवश्यकता है, एक क्वेरी (2) लिखें और फ़ील्ड चर घोषित करें।
रीड फ़ील्ड्स बटन (3)
मान्य अनुरोध पर सभी क्षेत्रों को स्वचालित रूप से पढ़ लेगा। डेटा देखने के लिए,
डेटा पूर्वावलोकन (4) पर क्लिक करें।

बहुत बढ़िया! हमें स्ट्रिंग के चार क्षेत्र मिले, अब हम उनके साथ लगभग कोई भी हेरफेर कर सकते हैं। उदाहरण के लिए, हम बस उन्हें सूचीबद्ध करते हैं और थोड़ा तर्क लिखते हैं।
हम स्थैतिक पाठ तत्वों में आवश्यक फ़ील्ड के नाम प्रिंट करते हैं और उन्हें शीर्षक कंटेनर में रखते हैं। हम विस्तार फ़ील्ड में पाठ फ़ील्ड तत्वों में चर क्षेत्रों का संकेत देंगे, क्योंकि वे गुणा करेंगे। हमारा पीडीएफ नाम, शहर और ईमेल पता प्रदर्शित करेगा। पूरी तरह से ऊब नहीं होने के लिए, चलो चौथे फ़ील्ड का उपयोग करके, टेक्स्ट फ़ील्ड तत्व में एक सरल तर्क लिखते हैं - क्लाइंट का लिंग, सेक्स।
हम निम्नलिखित कार्य करते हैं: यदि ग्राहक एक महिला है, तो श्रीमती को नाम के सामने जोड़ा जाएगा, यदि पुरुष श्री है। ऐसा करने के लिए, जावा टर्नरी ऑपरेटर का उपयोग करें:
<textFieldExpression> <![CDATA[$F{sex}.equals( "male" )?"Mr. "+$F{name}:"Mrs. "+$F{name}]]> </textFieldExpression>
स्रोत बटन के बगल में
पूर्वावलोकन पर क्लिक करके, आप परिणाम देख सकते हैं:

जैसा कि आप स्क्रीनशॉट में देख सकते हैं, पीडीएफ को सफलतापूर्वक इकट्ठा किया गया था: इसने सभी मानों को लिया और तर्क को लागू किया, सही ढंग से श्रीमती को नीचे रखा। और मि।
हमें सिटी इनपुट पैरामीटर भी मिलेगा ताकि शहर द्वारा डेटा को फ़िल्टर करना संभव हो। यह या तो
पैरामीटर पर क्लिक करके किया जा सकता है
→ आउटलाइन विंडो में
पैरामीटर बनाएं , या
नाम और
वर्ग विशेषताओं के साथ एक नया
पैरामीटर टैग जोड़कर:
<parameter name="City" class="java.lang.String"/>
यह केवल SQL क्वेरी के लिए पैरामीटर जोड़ने के लिए बना रहता है:
SELECT Id, name, sex, city, email FROM users WHERE city = $P{City}
हम सैन फ्रांसिस्को को सिटी पैरामीटर में पास करते हैं (मैं आपको अगले पैराग्राफ में बताऊंगा कि यह कैसे करना है) और परिणाम देखने के लिए
डेटा पूर्वावलोकन पर क्लिक करें।
डेटा को सफलतापूर्वक फ़िल्टर करके PDF एकत्र किया गया था। हम और आगे बढ़ेंचूंकि हमारे पास पहले से ही एक गतिशील रूप से पीडीएफ फाइल है, इसलिए हम इसे अपने फ्रंट-एंड एप्लिकेशन के साथ आगे एकीकरण के लिए सर्वर पर अपलोड कर सकते हैं। ऐसा करने के लिए,
जैस्परपरपोर्ट सर्वर बटन पर
प्रकाशित रिपोर्ट पर क्लिक करें → सर्वर को खोलने के लिए डबल-क्लिक करें → सर्वर फ़ोल्डर का चयन करें जहां पीडीएफ डाउनलोड करें (हमारे मामले में,
रिपोर्ट ) →
अगला → रिपॉजिटरी से डेटा स्रोत → सर्वर एप्लिकेशन पर पहले बनाए गए डेटा स्रोत का चयन
करें →
समाप्त करें ।
सीमांत एकता
JasperReports API में क्लाइंट-सर्वर इंटरैक्शन -
REST v2 के लिए अपना स्वयं का Restful कार्यान्वयन शामिल है। यदि यह आपको सूट नहीं करता है, तो आप एक साधारण ऑब्जेक्ट एक्सेस प्रोटोकॉल -
SOAP का उपयोग कर सकते हैं।
हम REST v2 पर विचार करेंगे।
CRUD के लिए चार मुख्य विधियाँ (क्रिएट-रीड-अपडेट-डिलीट) एक्शन उपलब्ध हैं: GET (प्राप्त करें), POST (ऐड, चेंज, डिलीट), PUT (ऐड, रिप्लेस), DELETE (डिलीट)। सभी विस्तृत जानकारी प्रलेखन में उपर्युक्त लिंक पर उपलब्ध है।
हम इस लेख के लिए अधिक सामान्य और प्रासंगिक GET विधि पर विचार करेंगे।
http://<host>:<port>/jasperserver[pro]/rest_v2/reports/path/to/report.<format>?<arguments>
ऊपर एक
सिंक्रोनस रिक्वेस्ट है, जिसके साथ आप एक रिक्वेस्ट-रिस्पॉन्स में फाइल का आउटपुट (फिनिश्ड पीडीएफ) प्राप्त कर सकते हैं (आप
यहां अतुल्यकालिक कॉल पा सकते हैं)।
मुझे लगता है कि होस्ट और पोर्ट के साथ सब कुछ स्पष्ट है, और
/ रिपोर्ट / पथ / टू / रिपोर्ट उस फाइल का URI है जिसे कॉल किया जा रहा है। चूँकि हमने रिपोर्ट सर्वर फ़ोल्डर में पीडीएफ फाइल (उदाहरण। जेआरएक्सएमएल) के स्रोत को तैनात किया है, यूआरआई का पूरा संस्करण होगा: / रिपोर्ट / रिपोर्ट / उदाहरण।
प्रारूप एक प्रारूप है (हमारे मामले में, पीडीएफ)।
तर्क पैरामीटर हैं।
ऊपर, हमने सिटी पैरामीटर को जोड़ा, और हम इस शहर के डेटा को फ़िल्टर करने के लिए सैन फ्रांसिस्को के मूल्य के अनुरोध में इसे पारित करेंगे।
यदि कॉल अधिकृत क्षेत्र से नहीं है, तो आपको दो और पैरामीटर / विशेषताएँ जोड़ने की आवश्यकता है:
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 बॉक्स लाइब्रेरी का उपयोग करके उदाहरण के रूप में जावा का उपयोग करना, हम देखेंगे कि आप बाहरी एप्लिकेशन से पीडीएफ फाइल कैसे उत्पन्न और चुन सकते हैं, और फिर इसे पीएनजी में परिवर्तित कर सकते हैं।
नीचे एक विधि के साथ
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; } }
आप एक ही परिणाम का उपयोग कर प्राप्त कर सकते हैं, उदाहरण के लिए, स्प्रिंग फ्रेमवर्क। लेकिन मैंने एक सार्वभौमिक तरीका दिखाने की कोशिश की, जिसे जावा के साथ काम करते समय एंड्रॉइड और वेब दोनों पर लागू किया जा सकता है।
निष्कर्ष
यदि आप एक ऑनलाइन स्टोर के लिए एक साधारण चेक की पीढ़ी को स्वचालित करना चाहते हैं और आपके पास इसे बनाने के लिए सीमित समय है, तो मैं आपके प्रोजेक्ट के मूल उपकरण या परिचित ढांचे का उपयोग करने की सलाह देता हूं। जैस्पररीपोर्ट्स को स्थापित करने में लगने वाले समय के बाद से, अधिक जटिल रिपोर्टिंग रूपों के विकास के लिए प्रलेखन के साथ परिचित होना उचित नहीं हो सकता है। अन्य मामलों में, ऑटोमेशन रिपोर्टिंग के लिए जैस्पररीपोर्ट एक अच्छा खुला स्रोत समाधान है।