יצירת קבצי PDF ב- Java

1. הקדמה

במאמר מהיר זה, נתמקד ביצירת מסמך PDF מאפס בהתבסס על ספריית iText ו- PdfBox פופולרית.

2. תלות Maven

בואו נסתכל על התלות של Maven, שצריכה להיכלל בפרויקט שלנו:

 com.itextpdf itextpdf 5.5.10 org.apache.pdfbox pdfbox 2.0.4 

הגרסה האחרונה של הספריות נמצאת כאן: iText ו- PdfBox.

יש להוסיף תלות נוספת אחת למקרה שהקובץ שלנו יצטרך להיות מוצפן. חבילת ספק הטירה של Bounty מכילה יישומים של אלגוריתמים הצפנתיים ונדרשת על ידי שתי הספריות:

 org.bouncycastle bcprov-jdk15on 1.56 

הגרסה האחרונה של הספרייה נמצאת כאן: ספק הטירה של באונטי.

3. סקירה כללית

שניהם, ה- iText ו- PdfBox הם ספריות Java המשמשות ליצירה / מניפולציה של קבצי PDF. למרות שהתפוקה הסופית של הספריות זהה, הן פועלות בצורה קצת שונה. בואו נסתכל עליהם.

4. צור Pdf ב- IText

4.1. הכנס טקסט ל- PDF

בואו נסתכל, באופן שבו קובץ חדש עם טקסט "שלום עולם" מוחדר לקובץ pdf

מסמך מסמך = מסמך חדש (); PdfWriter.getInstance (מסמך, FileOutputStream חדש ("iTextHelloWorld.pdf")); document.open (); גופן גופן = FontFactory.getFont (FontFactory.COURIER, 16, BaseColor.BLACK); נתח נתח = נתח חדש ("שלום עולם", פונט); document.add (נתח); document.close ();

יצירת קובץ PDF בעזרת ספריית iText מבוססת על מניפולציה של אובייקטים המיישמים אלמנטים ממשק ב מסמך (בגרסה 5.5.10 יש 45 מהיישומים האלה).

האלמנט הקטן ביותר שניתן להוסיף למסמך ולהשתמש בו נקרא חתיכה, שהוא בעצם מחרוזת עם גופן מוחל.

בנוסף, חתיכהניתן לשלב עם אלמנטים אחרים כמו פסקאות, סָעִיף וכו 'וכתוצאה מכך מסמכים נאים למראה.

4.2. הכנסת תמונה

ספריית iText מספקת דרך קלה להוסיף תמונה למסמך. אנחנו פשוט צריכים ליצור תמונה למשל ולהוסיף אותו ל- מסמך.

נתיב נתיב = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). ToURI ()); מסמך מסמך = מסמך חדש (); PdfWriter.getInstance (מסמך, FileOutputStream חדש ("iTextImageExample.pdf")); document.open (); תמונה img = Image.getInstance (path.toAbsolutePath (). ToString ()); document.add (img); document.close ();

4.3. הכנסת טבלה

אנו עלולים להיתקל בבעיה כאשר נרצה להוסיף טבלה ל- pdf שלנו. למרבה המזל iText מספקת פונקציות כאלה מהקופסה.

ראשית מה שאנחנו צריכים לעשות זה ליצור PdfTable אובייקט ובבנאי לספק מספר עמודות לטבלה שלנו. עכשיו אנחנו יכולים פשוט להוסיף תא חדש על ידי התקשרות

כעת אנו יכולים פשוט להוסיף תא חדש על ידי התקשרות ל- תוסף תא שיטה על אובייקט הטבלה החדש שנוצר. iText תיצור שורות טבלה כל עוד כל התאים הדרושים מוגדרים, המשמעות היא שברגע שתיצור טבלה עם 3 עמודות ותוסיף לה 8 תאים, רק 2 שורות עם 3 תאים בכל אחת יוצגו.

בואו נסתכל על הדוגמה:

מסמך מסמך = מסמך חדש (); PdfWriter.getInstance (מסמך, FileOutputStream חדש ("iTextTable.pdf")); document.open (); טבלת PdfPTable = PdfPTable חדשה (3); addTableHeader (טבלה); addRows (טבלה); addCustomRows (טבלה); document.add (טבלה); document.close ();

אנו יוצרים טבלה חדשה עם 3 עמודות ושלוש שורות. בשורה הראשונה נתייחס ככותרת טבלה עם צבע רקע שונה ורוחב הגבול:

ריק ריק addTableHeader (טבלת PdfPTable) {Stream.of ("כותרת עמודות 1", "כותרת עמודות 2", "כותרת עמודה 3"). forEach (columnTitle -> {PdfPCell header = new PdfPCell (); header.setBackgroundColor (BaseColor .LIGHT_GRAY); header.setBorderWidth (2); header.setPhrase (ביטוי חדש (columnTitle)); table.addCell (כותרת);}); }

השורה השנייה תורכב משלושה תאים רק עם טקסט, ללא עיצוב נוסף.

addRows בטל פרטי (טבלת PdfPTable) {table.addCell ("שורה 1, קול 1"); table.addCell ("שורה 1, קול 2"); table.addCell ("שורה 1, עמודה 3"); }

אנו יכולים לכלול לא רק טקסט בתאים אלא גם תמונות. בנוסף, כל תא עשוי להיות מעוצב בנפרד, בדוגמה המוצגת להלן אנו מיישמים התאמות יישור אופקיות ואנכיות:

ריק ריק addCustomRows (טבלת PdfPTable) זורק URISyntaxException, BadElementException, IOException {Path path = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). toURI ()); תמונה img = Image.getInstance (path.toAbsolutePath (). ToString ()); img.scalePercent (10); PdfPCell imageCell = PdfPCell חדש (img); table.addCell (imageCell); PdfPCell horizontalAlignCell = PdfPCell חדש (ביטוי חדש ("שורה 2, קול 2")); horizontalAlignCell.setHorizontalAlignment (Element.ALIGN_CENTER); table.addCell (horizontalAlignCell); PdfPCell verticalAlignCell = PdfPCell חדש (ביטוי חדש ("שורה 2, עמודה 3")); verticalAlignCell.setVerticalAlignment (Element.ALIGN_BOTTOM); table.addCell (verticalAlignCell); }

4.4. הצפנת קבצים

על מנת להחיל הרשאה באמצעות ספריית iText, עלינו כבר ליצור מסמך pdf. בדוגמה שלנו, נשתמש שלנו iTextHelloWorld.pdf קובץ שנוצר בעבר.

ברגע שאנחנו טוענים את הקובץ באמצעות קורא PDF, עלינו ליצור PdfStamper המשמש להחלת תוכן נוסף לקובץ כמו מטא נתונים, הצפנה וכו ':

PdfReader pdfReader = PdfReader חדש ("HelloWorld.pdf"); PdfStamper pdfStamper = PdfStamper חדש (pdfReader, FileOutputStream חדש ("encryptedPdf.pdf")); pdfStamper.setEncryption ("userpass" .getBytes (), ".getBytes (), 0, PdfWriter.ENCRYPTION_AES_256); pdfStamper.close ();

בדוגמה שלנו הצפנו את הקובץ בשתי סיסמאות. סיסמת המשתמש ("מעבר משתמש") כאשר למשתמש יש זכות קריאה בלבד ללא אפשרות להדפיס אותה, וסיסמת בעלים ("מעבר בעלים") המשמשת כמפתח ראשי המאפשר לאדם גישה מלאה ל- pdf.

אם אנו רוצים לאפשר למשתמש להדפיס pdf, במקום 0 (הפרמטר השלישי של setEncryptionאנחנו יכולים לעבור:

PdfWriter.ALLOW_PRINTING

כמובן, אנו יכולים לערבב הרשאות שונות כמו:

PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY

זכור כי באמצעות iText כדי להגדיר הרשאות גישה, אנו יוצרים גם קובץ PDF זמני אותו יש למחוק, ואם לא זה יכול להיות נגיש לחלוטין לאף אחד.

5. צור Pdf ב- PdfBox

5.1. הכנס טקסט ל- Pdf

כמנוגד ל אני מסמס, ה PdfBox הספרייה מספקת API המבוסס על מניפולציה בזרם. אין שיעורים כמו חתיכה/פסקה וכו ' PDDocument class הוא ייצוג Pdf בזיכרון שבו המשתמש כותב נתונים על ידי מניפולציה PDPageContentStream מעמד.

בואו נסתכל על דוגמת הקוד:

מסמך PDDocument = PDDocument חדש (); דף PDPage = PDPage חדש (); document.addPage (עמוד); PDPageContentStream contentStream = PDPageContentStream חדש (מסמך, עמוד); contentStream.setFont (PDType1Font.COURIER, 12); contentStream.beginText (); contentStream.showText ("שלום עולם"); contentStream.endText (); contentStream.close (); document.save ("pdfBoxHelloWorld.pdf"); document.close ();

5.2. הכנסת תמונה

הכנסת תמונות היא פשוטה.

ראשית עלינו לטעון קובץ וליצור PDImageXObject, לאחר מכן צייר אותו על המסמך (צריך לספק קואורדינטות מדויקות x, y).

זה הכל:

מסמך PDDocument = PDDocument חדש (); דף PDPage = PDPage חדש (); document.addPage (עמוד); נתיב נתיב = Paths.get (ClassLoader.getSystemResource ("Java_logo.png"). ToURI ()); PDPageContentStream contentStream = PDPageContentStream חדש (מסמך, עמוד); תמונה של PDImageXObject = PDImageXObject.createFromFile (path.toAbsolutePath (). ToString (), מסמך); contentStream.drawImage (תמונה, 0, 0); contentStream.close (); document.save ("pdfBoxImage.pdf"); document.close (); 

5.3. הכנסת טבלה

לצערי, PdfBox אינו מספק שיטות מחוץ לקופסה המאפשרות יצירת טבלאות. מה שאנחנו יכולים לעשות במצב כזה הוא לצייר אותו ידנית - תרתי משמע כל קו עד שהציור שלנו דומה לשולחן החלומי שלנו.

5.4. הצפנת קבצים

PdfBox הספרייה מספקת אפשרות להצפין ולהתאים הרשאת קבצים למשתמש. בהשוואה ל אני מסמס, זה לא דורש להשתמש בקובץ קיים כבר, כפי שאנחנו פשוט משתמשים PDDocument. ההרשאות לקובץ PDF מטופלות על ידי הרשאת גישה בכיתה, שם נוכל להגדיר אם משתמש יוכל לשנות, לחלץ תוכן או להדפיס קובץ.

בהמשך, אנו יוצרים a תקן הגנה מדיניות אובייקט שמוסיף הגנה מבוססת סיסמה למסמך. אנו יכולים לציין שני סוגים של סיסמא. סיסמת המשתמש, שאחריה האדם יוכל לפתוח קובץ עם הרשאות גישה שהוחלו וסיסמת בעלים (ללא מגבלות על הקובץ):

מסמך PDDocument = PDDocument חדש (); דף PDPage = PDPage חדש (); document.addPage (עמוד); AccessPermission accessPermission = AccessPermission חדש (); accessPermission.setCanPrint (שקר); accessPermission.setCanModify (שקר); StandardProtectionPolicy standardProtectionPolicy = חדש StandardProtectionPolicy ("בעל מעבר", "מעבר משתמש", accessPermission); document.protect (standardProtectionPolicy); document.save ("pdfBoxEncryption.pdf"); document.close (); 

הדוגמה שלנו מציגה מצב שאם משתמש מספק סיסמת משתמש, לא ניתן לשנות ולהדפיס את הקובץ.

6. מסקנות

במדריך זה דנו בדרכים ליצירת קובץ pdf בשתי ספריות Java פופולריות.

דוגמאות מלאות ניתן למצוא בפרויקט מבוסס Maven באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found