أصل المشكلة منذ
وقت ليس ببعيد، قمت بتنفيذ مشروع صغير لإنشاء تقارير بتنسيق PDF من خلال JSP، وهو ما كان بمثابة لفتة للنظر. بعض نماذج معلومات الشركة هي تقارير Html عبر الشبكة، على الرغم من أن IE يمكنه طباعة المحتوى المعروض فيه مباشرة، من وجهة نظر الواجهة، إذا تمت طباعة نتائج عرض Html مباشرة، فإنها لا تبدو جميلة جدًا. إذا قمت بتحويله إلى ملف PDF ثم طباعته، فسيكون تأثير الطباعة أفضل بكثير.
مقدمة إلى iText
iText هي مكتبة فئة Java مفتوحة المصدر يمكن استخدامها لإنشاء ملفات PDF بسهولة. يمكنك تنزيل أحدث إصدار من مكتبة الفصل بزيارة http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948 بعد اكتمال التنزيل، ستحصل على حزمة .jar أضف هذه الحزمة إليها مسار فئة JDK لاستخدامه. إذا كانت هناك حاجة إلى ظهور الأحرف الصينية واليابانية والكورية في ملف PDF الذي تم إنشاؤه، فستحتاج أيضًا إلى تنزيل حزمة iTextAsian.jar بزيارة http://itext.sourceforge.net/downloads/iTextAsian.jar .
فيما يتعلق باستخدام مكتبة فئة iText، http://www.lowagie.com/iText/tutorial/index.html يحتوي على برنامج تعليمي أكثر تفصيلاً. يبدأ هذا البرنامج التعليمي من البداية ويقدم بشكل منهجي طرق وتقنيات وضع النصوص والصور والجداول وما إلى ذلك في ملفات PDF. بعد قراءة هذا البرنامج التعليمي، ستتمكن من إنشاء بعض ملفات PDF البسيطة والمعقدة. ومع ذلك، فإن محاولة حل جميع الصعوبات التي تواجه عملية إنشاء ملفات PDF من خلال البرامج التعليمية هي بلا شك ترف. لذلك، من المهم جدًا قراءة وثائق iText API. عندما يقوم القراء بتنزيل مكتبة الفصل، يمكنهم أيضًا تنزيل وثائق مكتبة الفصل.
كيفية استخدام iText لإنشاء تقارير PDF في برنامج Java.
ما يلي هو أبسط مثال في البرنامج التعليمي أعلاه. يصور هذا المثال إطار البرنامج العام لإنشاء ملفات PDF من خلال iText. يحتاج القراء فقط إلى إضافة المحتوى الذي يريدون وضعه في ملف PDF بين البيانين document.open() و document. Close();. يضيف هذا المثال سطرًا من النص "Hello World" فقط إلى ملف PDF.
مستند المستند = مستند جديد()؛
حاول
{
PdfWriter.getInstance(document, new FileOutputStream ("Chap0101.pdf"));
document.open
(
);
document.add(new Paragraph("Hello World"));
DocumentException de)
{
System.err.println(
de.getMessage());
}
catch(IOException ioe)
{
System.err.println
(ioe.getMessage
());
على سبيل المثال أعلاه، إطار البرنامج واضح ومباشر للغاية. ومع ذلك، فإن تحديد موقع النص والصور والجداول في PDF يعد مهمة مزعجة للغاية. بصرف النظر عن عملية التعديل المستمر للموضع في البرنامج، ثم تشغيل البرنامج، وإنشاء ملف PDF، ومراقبة ما إذا كان موضع العناصر في ملف PDF معقولاً، يبدو أنه لا توجد طريقة أخرى أفضل.
لا تتوفركيفية إنشاء تقارير PDF من خلال JSP
في البرامج التعليمية لـ iText، وهناك القليل نسبيًا من المعلومات ذات الصلة على الإنترنت. رأيت ذات مرة شخصًا ينشر على CSDN يطلب تفاصيل التنفيذ، وأجاب أحدهم عن مبدأ التنفيذ: قم أولاً بإنشاء ملف PDF على الخادم، ثم يختار المستخدم تنزيله أو فتحه من خلال النقر على الرابط التشعبي الذي يشير إلى ملف PDF. هذه فكرة، أو واحدة من الأفكار. يحقق هذا المقال هذه الفكرة ويعطي فكرة أخرى وينفذها بطريقتين.
1) إنشاء ملفات PDF مباشرة على الخادم.
<%@ page import ="com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"%>
<%
String filename = "PDF"+(new Random()).nextInt
()
+".pdf" ;
Document
document
= new Document(PageSize.A4
)
;
document.add
(new Paragraph("Hello World"));
document.إغلاق();
}
Catch(Exception e){}%>
يقوم البرنامج أعلاه بإنشاء ملف PDF ثابت على الخادم. من الواضح أن اسم ملف PDF الذي تم الحصول عليه في كل عملية تشغيل يجب أن يكون فريدًا وغير مكرر. يستخدم هذا البرنامج وظيفة عشوائية لتسمية ملفات PDF التي تم إنشاؤها. عيب هذا البرنامج هو أنه في كل مرة يتم تشغيله، سيتم إنشاء ملف PDF على الخادم إذا لم يتم حذفه في الوقت المناسب، فسيصبح العدد أكبر فأكبر، ومن الواضح أن هذا شيء لا يريده مشرف الموقع يرى.
2) قم بنقل ملف PDF إلى ذاكرة التخزين المؤقت للعميل في شكل دفق. وتتمثل ميزة ذلك في أنه لن يترك أي "آثار" على الخادم.
ط) الإنشاء مباشرة من خلال صفحة JSP
<%@
page import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
Response.setContentType( "application/pdf"
)
;
document. Close();
DataOutputput = new DataOutputStream(response.getOutputStream() );
byte
[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
length; i++ )
{
output.writeByte( bytes[i]
}
%>
ب) تم إنشاؤها من خلال Servlet
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*
;
importcom.lowagie.text.pdf
.*;
استجابة HttpServletResponse)
throws IOException,ServletException
{
Document document = new Document(PageSize.A4, 36,36,36,36);
ByteArrayOutputStream ba = new ByteArrayOutputStream();
حاول
{
PdfWriterwriter = PdfWriter.getInstance(document, ba)
; .open();
document.add(new Paragraph("Hello World"));
}
Catch(DocumentException de)
{
de.printStackTrace()
; }
document.إغلاق(
);
response.setContentType
(
"application/pdf");
response.setContentLength(
ba.size());
()؛
}
انتهى بي الأمر
باستخدام النهج الثاني في مشروعي. لقد تم تصحيح الكود المصدري لهذه المقالة على Tomcat4 الخاص بي. نأمل أن تجلب الراحة للجميع.
الجميع مدعوون لاستخدامه، إذا كنت بحاجة إلى إعادة طباعته، يرجى الإشارة إلى المصدر.