Java להמיר PDF ל- Base64

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

במדריך קצר זה נראה כיצד לבצע קידוד ופענוח Base64 של קובץ PDF באמצעות Java 8 ו- Apache Commons Codec.

אבל ראשית, בואו נסתכל במהירות על היסודות של Base64.

2. יסודות בסיס 64

כאשר אנו שולחים נתונים דרך החוט, עלינו לשלוח אותם בפורמט בינארי. אך אם אנו שולחים 0 ו -1 בלבד, פרוטוקולים שונים של שכבת תחבורה עשויים לפרש אותם באופן שונה והנתונים שלנו עלולים להיפגם במהלך הטיסה.

כך, כדי לקבל ניידות וסטנדרטים משותפים בעת העברת נתונים בינאריים, Base64 הגיע לתמונה.

מכיוון שהשולח והמקבל מבינים והסכימו להשתמש בתקן, הסבירות שהנתונים שלנו ילכו לאיבוד או יתפרשו בצורה לא נכונה פוחתת.

עכשיו בואו נראה כמה דרכים להחיל את זה על PDF.

3. המרה באמצעות Java 8

החל מג'אווה 8, יש לנו כלי עזר java.util.Base64 המספק קודנים ומפענחים עבור תוכנית קידוד Base64. הוא תומך בסוגים בסיסיים, URL בטוחים ו- MIME כמפורט ב- RFC 4648 ו- RFC 2045.

3.1. הַצפָּנָה

כדי להמיר PDF ל- Base64, ראשית עלינו להשיג אותו בתים ו- להעביר את זה java.util.Base64. Encoderשל לְהַצְפִּין שיטה:

בתים [] inFileBytes = Files.readAllBytes (Paths.get (IN_FILE)); בתים [] מקודדים = java.util.Base64.getEncoder (). קידוד (inFileBytes);

פה, בקובץ הוא הנתיב ל- PDF הקלט שלנו.

3.2. קידוד סטרימינג

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

נסה (OutputStream os = java.util.Base64.getEncoder (). לעטוף (FileOutputStream חדש (OUT_FILE)); FileInputStream fis = FileInputStream חדש (IN_FILE)) {בתים [] בתים = בתים חדשים [1024]; לקרוא int; בעוד ((read = fis.read (בתים))> -1) {os.write (בתים, 0, לקרוא); }}

פה, בקובץ הוא הנתיב ל- PDF הקלט שלנו, ו- OUT_FILE הוא הנתיב לקובץ המכיל את המסמך המקודד ל- Base64. במקום לקרוא את כל ה- PDF בזיכרון ואז לקודד את המסמך המלא בזיכרון, אנו קוראים עד 1Kb נתונים בכל פעם ומעבירים את הנתונים דרך המקודד לתוך OutputStream.

3.3. פִּעַנוּחַ

בסוף הקבלה, אנו מקבלים את הקובץ המקודד.

אז עכשיו אנחנו צריכים לפענח אותו כדי להחזיר את הבתים המקוריים שלנו ולכתוב אותם ל- a FileOutputStream כדי לקבל את ה- PDF המפוענח:

בית [] מפוענח = java.util.Base64.getDecoder (). פענוח (מקודד); FileOutputStream fos = FileOutputStream חדש (OUT_FILE); fos.write (מפוענח); fos.flush (); fos.close ();

פה, OUT_FILE הוא הנתיב למסמך PDF שלנו שייווצר.

4. המרה באמצעות אפאצ'י קומונס

לאחר מכן נשתמש בחבילת Codec של Apache Commons כדי להשיג את אותו הדבר. זה מבוסס על RFC 2045 וקדם את יישום Java 8 עליו דנו קודם. לכן, כשאנחנו צריכים לתמוך במספר גרסאות JDK (כולל גרסאות מדור קודם) או ספקים, זה שימושי כ- API של צד שלישי.

4.1. Maven

כדי שנוכל להשתמש בספריית אפאצ'י, עלינו להוסיף תלות ב- pom.xml:

 commons-codec commons-codec 1.14 

הגרסה האחרונה של האמור לעיל נמצאת ב- Maven Central.

4.2. הַצפָּנָה

השלבים זהים ל- Java 8, אלא שהפעם אנו מעבירים את הבתים המקוריים שלנו ל- encodeBase64 שיטת ה- org.apache.commons.codec.binary.Base64 מעמד:

בתים [] inFileBytes = Files.readAllBytes (Paths.get (IN_FILE)); בתים [] מקודדים = org.apache.commons.codec.binary.Base64.encodeBase64 (inFileBytes); 

4.3. קידוד סטרימינג

קידוד סטרימינג אינו נתמך על ידי ספרייה זו.

4.4. פִּעַנוּחַ

שוב, אנחנו פשוט קוראים decodeBase64 שיטה וכתוב את התוצאה לקובץ:

בית [] מפוענח = org.apache.commons.codec.binary.Base64.decodeBase64 (מקודד); FileOutputStream fos = FileOutputStream חדש (OUT_FILE); fos.write (מפוענח); fos.flush (); fos.close (); 

5. בדיקות

כעת נבדוק את הקידוד והפענוח שלנו באמצעות בדיקת JUnit פשוטה:

מחלקה ציבורית EncodeDecodeUnitTest {סופי פרטי סטטי מחרוזת IN_FILE = // נתיב לקובץ שממנו יקודד; סופי סטטי פרטי מחרוזת OUT_FILE = // נתיב לקובץ לפענוח; בתים סטטיים פרטיים [] inFileBytes; @BeforeClass קובץ חלל סטטי ציבוריToByteArray () זורק IOException {inFileBytes = Files.readAllBytes (Paths.get (IN_FILE)); } @Test ציבורי בטל שניתןJavaBase64_whenEncoded_thenDecodedOK () זורק IOException {בתים [] מקודדים = java.util.Base64.getEncoder (). קידוד (inFileBytes); בתים [] מפוענחים = java.util.Base64.getDecoder (). פענוח (מקודד); writeToFile (OUT_FILE, מפוענח); assertNotEquals (מקודד.אורך, מפוענח.אורך); assertEquals (inFileBytes.length, decoded.length); assertArrayEquals (מפוענח, inFileBytes); } @Test ציבורי בטל שניתןJavaBase64_whenEncodedStream_thenDecodedStreamOK () זורק IOException {נסה (OutputStream os = java.util.Base64.getEncoder (). לעטוף (FileOutputStream חדש (OUT_FILE) חדש); FileInputStreamStream = [FileInputStreamE] = חדש_קובץ = חדש_הקובץ [FileInputStreamE =] בית חדש [1024]; לקרוא int; בעוד ((read = fis.read (בתים))> -1) {os.write (בתים, 0, לקרוא); }} בתים [] מקודדים = java.util.Base64.getEncoder (). קידוד (inFileBytes); בתים [] encodedOnDisk = Files.readAllBytes (Paths.get (OUT_FILE)); assertArrayEquals (מקודד, מקודד OnDisk); בתים [] מפוענחים = java.util.Base64.getDecoder (). פענוח (מקודד); בתים [] decodedOnDisk = java.util.Base64.getDecoder (). פענוח (encodedOnDisk); assertArrayEquals (מפוענח, מפוענחOnDisk); } @Test הציבור בטל givenApacheCommons_givenJavaBase64_whenEncoded_thenDecodedOK () זורק IOException {byte [] encoded = org.apache.commons.codec.binary.Base64.encodeBase64 (inFileBytes); בית [] מפוענח = org.apache.commons.codec.binary.Base64.decodeBase64 (מקודד); writeToFile (OUT_FILE, מפוענח); assertNotEquals (מקודד.אורך, מפוענח.אורך); assertEquals (inFileBytes.length, decoded.length); assertArrayEquals (מפוענח, inFileBytes); } ריק ריק לכתיבה (קובץ מחרוזת, בתים [] בתים) זורק IOException {FileOutputStream fos = FileOutputStream חדש (fileName); fos.write (בתים); fos.flush (); fos.close (); }}

כפי שאנו רואים, אנו קוראים תחילה את בתים הקלט ב- a @לפני השיעור השיטה, ובשנינו @מִבְחָן שיטות, אימת כי:

  • מוּצפָּן ו מְפוּענָח מערכי בתים הם באורכים שונים
  • inFileBytes ו מְפוּענָח מערכי בתים הם באותו אורך ויש להם אותו תוכן

כמובן שנוכל לפתוח את קובץ ה- PDF המפענח שיצרנו ולראות שהתוכן זהה לקובץ שהבאנו כקלט.

6. מסקנה

במדריך מהיר זה למדנו עוד על כלי השירות Base64 של Java.

ראינו גם דוגמאות קוד עבור המרת PDF ל- Base64 וממנה באמצעות Java 8 ו- Codec של Apache Commons. מעניין שמימוש ה- JDK מהיר בהרבה מזה של אפאצ'י.

כמו תמיד, קוד המקור זמין ב- GitHub.


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