Java Konvertálja a PDF-et Base64-be

1. Áttekintés

Ebben a rövid bemutatóban meglátjuk hogyan kell végrehajtani a PDF fájl Base64 kódolását és dekódolását a Java 8 és az Apache Commons Codec használatával.

De először nézzük meg gyorsan a Base64 alapjait.

2. A Base64 alapjai

Amikor adatokat küldünk a vezetéken, bináris formátumban kell elküldenünk. De ha csak 0-at és 1-et küldünk, akkor a különböző szállítási réteg protokollok eltérően értelmezhetik őket, és az adataink megrongálódhatnak repülés közben.

Így, hogy hordozhatósága és közös szabványai legyenek a bináris adatok átvitele közben, a Base64 került a képbe.

Mivel a feladó és a fogadó egyaránt megérti és elfogadta a szabvány használatát, az adatok elvesztésének vagy félreértelmezésének valószínűsége jelentősen csökken.

Most nézzünk meg néhány módszert ennek alkalmazására egy PDF-fájlban.

3. Konvertálás a Java 8 használatával

A Java 8-tól kezdve van egy segédprogramunk java.util.Base64 amely kódolókat és dekódereket biztosít az Base64 kódolási sémához. Támogatja az RFC 4648 és az RFC 2045 szabványokban meghatározott Basic, URL safe és MIME típusokat.

3.1. Kódolás

A PDF Base64 formátumba konvertálásához először bájtokban és átadni java.util.Base64.Encoder’S kódol módszer:

byte [] inFileBytes = Files.readAllBytes (elérési utak.get (IN_FILE)); byte [] encoded = java.util.Base64.getEncoder (). encode (inFileBytes);

Itt, IN_FILE a bemeneti PDF-fájlunk elérési útja.

3.2. Streaming kódolás

Nagyobb fájlok vagy korlátozott memóriájú rendszerek esetén sokkal hatékonyabb a kódolást egy adatfolyam segítségével végrehajtani, ahelyett, hogy a memóriában lévő összes adatot elolvassa. Nézzük meg, hogyan lehet ezt megvalósítani:

próbáld ki (OutputStream os = java.util.Base64.getEncoder (). wrap (új FileOutputStream (OUT_FILE)); FileInputStream fis = új FileInputStream (IN_FILE)) {byte [] byte = új byte [1024]; int olvasni; míg ((read = fis.read (byte))> -1) {os.write (byte, 0, read); }}

Itt, IN_FILE a bemeneti PDF fájlunk elérési útja, és OUT_FILE a Base64-kódolású dokumentumot tartalmazó fájl elérési útja. Ahelyett, hogy a teljes PDF-fájlt beolvassuk a memóriába, majd a teljes dokumentumot a memóriába kódolnánk, egyszerre legfeljebb 1 KB adatot olvasunk, és ezeket az adatokat a kódolón keresztül továbbítjuk a OutputStream.

3.3. Dekódolás

A fogadó végén megkapjuk a kódolt fájlt.

Tehát most nekünk kell dekódolja, hogy visszakapja eredeti bájtjainkat, és beírja őket a FileOutputStream a dekódolt PDF megszerzéséhez:

bájt [] dekódolva = java.util.Base64.getDecoder (). dekódol (kódolva); FileOutputStream fos = új FileOutputStream (OUT_FILE); fos.write (dekódolt); fos.flush (); fos.close ();

Itt, OUT_FILE a létrehozandó PDF-fájlhoz vezető út.

4. Konvertálás az Apache Commons használatával

Ezt követően az Apache Commons Codec csomagot fogjuk használni ennek elérésére. Ez az RFC 2045-re épül, és megelőzte a korábban már tárgyalt Java 8 implementációt. Tehát, ha több JDK verziót (beleértve a régieket is) vagy szállítókat kell támogatnunk, ez jól jön harmadik fél API-ként.

4.1. Maven

Az Apache könyvtár használatához hozzá kell adnunk egy függőséget a könyvtárunkhoz pom.xml:

 commons-kodek commons-kodek 1.14 

A fentiek legfrissebb verziója megtalálható a Maven Central oldalon.

4.2. Kódolás

A lépések ugyanazok, mint a Java 8 esetében, azzal a különbséggel, hogy ezúttal eredeti bájtjainkat adjuk át a encodeBase64 módszere org.apache.commons.codec.binary.Base64 osztály:

byte [] inFileBytes = Files.readAllBytes (elérési utak.get (IN_FILE)); byte [] encoded = org.apache.commons.codec.binary.Base64.encodeBase64 (inFileBytes); 

4.3. Streaming kódolás

Az adatfolyam-kódolást ez a könyvtár nem támogatja.

4.4. Dekódolás

Ismét egyszerűen hívjuk a decodeBase64 metódust, és írja az eredményt egy fájlba:

bájt [] dekódolt = org.apache.commons.codec.binary.Base64.decodeBase64 (kódolt); FileOutputStream fos = új FileOutputStream (OUT_FILE); fos.write (dekódolt); fos.flush (); fos.close (); 

5. Tesztelés

Most egy egyszerű JUnit teszt segítségével teszteljük a kódolást és a dekódolást:

public class EncodeDecodeUnitTest {private static final String IN_FILE = // elérési útja a kódolandó fájlhoz; private static final String OUT_FILE = // a fájl elérési útja, amelybe dekódolni kell; privát statikus bájt [] inFileBytes; A @BeforeClass nyilvános statikus void fileToByteArray () az IOException-t dobja {inFileBytes = Files.readAllBytes (Paths.get (IN_FILE)); } @Test public void givenJavaBase64_whenEncoded_thenDecodedOK () dobja az IOException {byte [] encoded = java.util.Base64.getEncoder (). Encode (inFileBytes); bájt [] dekódolva = java.util.Base64.getDecoder (). dekódol (kódolva); writeToFile (OUT_FILE, dekódolt); assertNotEquals (kódolt.hossz, dekódolt.hossz); assertEquals (inFileBytes.length, dekódolt.hossz); assertArrayEquals (dekódolt, inFileBytes); } @Test public void givenJavaBase64_whenEncodedStream_thenDecodedStreamOK () dobja az IOException {try (OutputStream os = java.util.Base64.getEncoder (). Wrap (new FileOutputStream (OUT_FILE)); FileInputStreamFis = (FileInputStreamFis = új bájt [1024]; int olvasni; míg ((read = fis.read (byte))> -1) {os.write (byte, 0, read); }} byte [] encoded = java.util.Base64.getEncoder (). encode (inFileBytes); byte [] encodedOnDisk = Files.readAllBytes (Paths.get (OUT_FILE)); assertArrayEquals (kódolt, encodedOnDisk); bájt [] dekódolva = java.util.Base64.getDecoder (). dekódol (kódolva); byte [] decodedOnDisk = java.util.Base64.getDecoder (). dekódolás (encodedOnDisk); assertArrayEquals (dekódolt, dekódoltOnDisk); } @Test public void givenApacheCommons_givenJavaBase64_whenEncoded_thenDecodedOK () dob IOException {byte [] encoded = org.apache.commons.codec.binary.Base64.encodeBase64 (inFileBytes); bájt [] dekódolt = org.apache.commons.codec.binary.Base64.decodeBase64 (kódolt); writeToFile (OUT_FILE, dekódolt); assertNotEquals (kódolt.hossz, dekódolt.hossz); assertEquals (inFileBytes.length, dekódolt.hossz); assertArrayEquals (dekódolt, inFileBytes); } private void writeToFile (karakterlánc fájlnév, bájt [] bájt) IOException-t dob ​​{FileOutputStream fos = új FileOutputStream (fájlnév); fos.write (byte); fos.flush (); fos.close (); }}

Mint láthatjuk, először a a bemeneti bájtokat olvastuk el @Óra előtt módszer, és mindkettőnkben @Teszt módszerek, igazolták, hogy:

  • kódolt és dekódolt a bájt tömbök különböző hosszúságúak
  • inFileBytes és dekódolt a bájt tömbök azonos hosszúságúak és azonos tartalommal rendelkeznek

Természetesen megnyithatjuk az általunk létrehozott dekódolt PDF fájlt is, és láthatjuk, hogy a tartalma megegyezik a bemenetként megadott fájlval.

6. Következtetés

Ebben a gyors bemutatóban többet megtudhattunk a Java Base64 segédprogramjáról.

Láttunk kódmintákat is a konvertálni egy PDF fájlt Base64-be és onnan a Java 8 és az Apache Commons Codec segítségével. Érdekes módon a JDK implementációja sokkal gyorsabb, mint az Apache.

Mint mindig, a forráskód is elérhető a GitHubon.