Java Prevod PDF na Base64

1. Prehľad

V tomto krátkom návode uvidíme ako urobiť Base64 kódovanie a dekódovanie súboru PDF pomocou Java 8 a Apache Commons Codec.

Najskôr však rýchlo poďme na základy Base64.

2. Základy Base64

Pri odosielaní údajov po drôte je potrebné ich odoslať v binárnom formáte. Ale ak pošleme iba 0 a 1, rôzne protokoly transportnej vrstvy ich môžu interpretovať odlišne a naše dáta sa môžu za letu poškodiť.

Takže kvôli prenosnosti binárnych dát mal prenosnosť a spoločné štandardy, na obrázku bol Base64.

Pretože odosielateľ aj príjemca štandardu rozumejú a súhlasili s jeho používaním, pravdepodobnosť straty alebo nesprávnej interpretácie našich údajov je výrazne znížená.

Teraz sa pozrime na niekoľko spôsobov, ako to použiť na súbor PDF.

3. Konverzia pomocou Java 8

Počnúc jazykom Java 8 máme program java.util.Base64 ktorá poskytuje kódovacie zariadenia a dekodéry pre kódovaciu schému Base64. Podporuje typy Basic, URL safe a MIME, ako sú špecifikované v RFC 4648 a RFC 2045.

3.1. Kódovanie

Aby sme mohli previesť PDF na Base64, musíme ho najskôr získať v bajtoch a prejsť java.util.Base64.Encoder‘S zakódovať metóda:

byte [] inFileBytes = Files.readAllBytes (Paths.get (IN_FILE)); byte [] encoded = java.util.Base64.getEncoder (). encode (inFileBytes);

Tu, IN_FILE je cesta k nášmu vstupnému PDF.

3.2. Streamovacie kódovanie

Pre väčšie súbory alebo systémy s obmedzenou pamäťou je oveľa efektívnejšie vykonávať kódovanie pomocou streamu namiesto čítania všetkých údajov v pamäti. Pozrime sa, ako to dosiahnuť:

try (OutputStream os = java.util.Base64.getEncoder (). wrap (new FileOutputStream (OUT_FILE)); FileInputStream fis = new FileInputStream (IN_FILE)) {byte [] bytes = new byte [1024]; int čítať; while ((read = fis.read (bytes))> -1) {os.write (bytes, 0, read); }}

Tu, IN_FILE je cesta k nášmu vstupnému PDF a OUT_FILE je cesta k súboru obsahujúcemu dokument kódovaný pomocou Base64. Namiesto načítania celého PDF do pamäte a následného kódovania celého dokumentu do pamäte načítame naraz až 1 kB dát a tieto údaje odovzdáme kódovacím zariadením do OutputStream.

3.3. Dekódovanie

Na konci prijímania dostaneme zakódovaný súbor.

Takže teraz musíme dekódujte ho, aby ste získali späť naše pôvodné bajty a zapísali ich do a FileOutputStream získať dekódovaný PDF:

byte [] dekódované = java.util.Base64.getDecoder (). dekódovať (kódované); FileOutputStream fos = nový FileOutputStream (OUT_FILE); fos.písať (dekódovať); fos.flush (); fos.close ();

Tu, OUT_FILE je cesta k nášmu PDF, ktoré sa má vytvoriť.

4. Konverzia pomocou Apache Commons

Ďalej budeme na dosiahnutie toho istého používať balík Apache Commons Codec. Je založený na RFC 2045 a predchádza implementácii Java 8, o ktorej sme hovorili už skôr. Takže, keď potrebujeme podporiť viac verzií JDK (vrátane starších) alebo dodávateľov, príde to vhodne ako API tretích strán.

4.1. Maven

Aby sme mohli používať knižnicu Apache, musíme do našej pridať závislosť pom.xml:

 commons-codec commons-codec 1.14 

Najnovšiu verziu vyššie uvedeného nájdete na serveri Maven Central.

4.2. Kódovanie

Kroky sú rovnaké ako v prípade Java 8, až na to, že tentokrát odovzdáme naše pôvodné bajty serveru encodeBase64 metóda org.apache.commons.codec.binary.Base64 trieda:

byte [] inFileBytes = Files.readAllBytes (Paths.get (IN_FILE)); byte [] encoded = org.apache.commons.codec.binary.Base64.encodeBase64 (inFileBytes); 

4.3. Streamovacie kódovanie

Táto knižnica nepodporuje kódovanie streamovania.

4.4. Dekódovanie

Opäť jednoducho hovoríme decodeBase64 metódu a zapísať výsledok do súboru:

byte [] dekódovaný = org.apache.commons.codec.binary.Base64.decodeBase64 (kódovaný); FileOutputStream fos = nový FileOutputStream (OUT_FILE); fos.písať (dekódovať); fos.flush (); fos.close (); 

5. Testovanie

Teraz otestujeme naše kódovanie a dekódovanie pomocou jednoduchého testu JUnit:

public class EncodeDecodeUnitTest {private static final String IN_FILE = // cesta k súboru, z ktorého sa má zakódovať; private static final String OUT_FILE = // cesta k súboru, do ktorého sa má dekódovať; private static byte [] inFileBytes; @BeforeClass public static void fileToByteArray () vyvolá IOException {inFileBytes = Files.readAllBytes (Paths.get (IN_FILE)); } @Test public void givenJavaBase64_whenEncoded_thenDecodedOK () vyvolá IOException {byte [] encoded = java.util.Base64.getEncoder (). Encode (inFileBytes); byte [] dekódované = java.util.Base64.getDecoder (). dekódovať (kódované); writeToFile (OUT_FILE, dekódované); assertNotEquals (encoded.length, decoded.length); assertEquals (inFileBytes.length, decoded.length); assertArrayEquals (dekódované, inFileBytes); } @Test public void givenJavaBase64_whenEncodedStream_thenDecodedStreamOK () hodí IOException {try (OutputStream os = java.util.Base64.getEncoder (). Wrap (nový FileOutputStream (OUT_FILE)); FileInputStream fis = IN_File = IN_File = IN nový bajt [1024]; int čítať; while ((read = fis.read (bytes))> -1) {os.write (bytes, 0, read); }} byte [] encoded = java.util.Base64.getEncoder (). encode (inFileBytes); byte [] encodedOnDisk = Files.readAllBytes (Paths.get (OUT_FILE)); assertArrayEquals (encoded, encodedOnDisk); byte [] dekódované = java.util.Base64.getDecoder (). dekódovať (kódované); byte [] decodedOnDisk = java.util.Base64.getDecoder (). decode (encodedOnDisk); assertArrayEquals (dekódované, decodedOnDisk); } @Test public void givenApacheCommons_givenJavaBase64_whenEncoded_thenDecodedOK () hodí IOException {byte [] encoded = org.apache.commons.codec.binary.Base64.encodeBase64 (inFileBytes); byte [] dekódovaný = org.apache.commons.codec.binary.Base64.decodeBase64 (kódovaný); writeToFile (OUT_FILE, dekódované); assertNotEquals (encoded.length, decoded.length); assertEquals (inFileBytes.length, decoded.length); assertArrayEquals (dekódované, inFileBytes); } private void writeToFile (reťazec fileName, byte [] bajtov) hodí IOException {FileOutputStream fos = nový FileOutputStream (fileName); fos.write (bajty); fos.flush (); fos.close (); }}

Ako vidíme, najskôr sme načítali vstupné bajty v a @BeforeClass metóda, a to v oboch @Test metódy overili, že:

  • zakódovaný a dekódovaný bajtové polia majú rôznu dĺžku
  • inFileBytes a dekódovaný bajtové polia sú rovnako dlhé a majú rovnaký obsah

Samozrejme môžeme otvoriť aj dekódovaný súbor PDF, ktorý sme vytvorili, a zistiť, či je obsah rovnaký ako súbor, ktorý sme zadali ako vstup.

6. Záver

V tomto rýchlom výučbe sme sa dozvedeli viac o obslužnej rutine Java Base64.

Videli sme aj ukážky kódu pre prevod PDF do az Base64 pomocou Java 8 a Apache Commons Codec. Je zaujímavé, že implementácia JDK je oveľa rýchlejšia ako implementácia Apache.

Ako vždy, zdrojový kód je k dispozícii na GitHub.


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