Java Pretvori PDF u Base64

1. Pregled

U ovom kratkom vodiču vidjet ćemo kako izvesti Base64 kodiranje i dekodiranje PDF datoteke pomoću Java 8 i Apache Commons Codec.

Ali prvo, zavirimo u osnove Base64.

2. Osnove Base64

Kada podatke šaljemo putem žice, moramo ih poslati u binarnom formatu. Ali ako pošaljemo samo 0 i 1, različiti protokoli transportnog sloja mogu ih različito interpretirati i naši bi se podaci mogli oštetiti u letu.

Tako, kako bi imao prenosivost i zajedničke standarde tijekom prijenosa binarnih podataka, Base64 se pojavio na slici.

Budući da se pošiljatelj i primatelj razumiju i složili su se s korištenjem standarda, vjerojatnost da se naši podaci izgube ili pogrešno protumače znatno je smanjena.

Pogledajmo sada nekoliko načina kako to primijeniti na PDF.

3. Pretvorba pomoću Jave 8

Počevši od Jave 8, imamo uslužni program java.util.Base64 koji pruža enkodere i dekodere za shemu kodiranja Base64. Podržava osnovne, URL sigurne i MIME vrste kako je navedeno u RFC 4648 i RFC 2045.

3.1. Kodiranje

Da bismo pretvorili PDF u Base64, prvo ga moramo dobiti u bajtovima i proći kroz njega java.util.Base64.Encoder‘S kodirati metoda:

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

Ovdje, IN_FILE je put do našeg ulaznog PDF-a.

3.2. Streaming kodiranje

Za veće datoteke ili sustave s ograničenom memorijom, mnogo je učinkovitije izvršiti kodiranje pomoću toka umjesto čitanja svih podataka u memoriji. Pogledajmo kako to postići:

probajte (OutputStream os = java.util.Base64.getEncoder (). wrap (novi FileOutputStream (OUT_FILE)); FileInputStream fis = novi FileInputStream (IN_FILE)) {bajt [] bajtova = novi bajt [1024]; int read; while ((read = fis.read (bytes))> -1) {os.write (bytes, 0, read); }}

Ovdje, IN_FILE je put do našeg ulaznog PDF-a i OUT_FILE je put do datoteke koja sadrži Base64 kodirani dokument. Umjesto čitanja cijelog PDF-a u memoriju, a zatim kodiranja cijelog dokumenta u memoriju, istodobno čitamo do 1 KB podataka i te podatke prenosimo kroz koder u Izlazni tok.

3.3. Dekodiranje

Na kraju prijema dobivamo kodiranu datoteku.

Tako da sada moramo dekodirajte ga da biste vratili izvorne bajtove i zapisali ih u FileOutputStream da biste dobili dekodirani PDF:

bajt [] dekodirano = java.util.Base64.getDecoder (). dekodirano (kodirano); FileOutputStream fos = novi FileOutputStream (OUT_FILE); fos.write (dekodirano); fos.flush (); fos.close ();

Ovdje, OUT_FILE je put do našeg PDF-a koji treba stvoriti.

4. Pretvorba pomoću Apache Commons

Dalje ćemo koristiti Apache Commons Codec paket da bismo postigli isto. Temelji se na RFC 2045 i prethodi implementaciji Jave 8 o kojoj smo ranije razgovarali. Dakle, kada trebamo podržati više JDK verzija (uključujući naslijeđene) ili dobavljače, ovo nam dobro dođe kao API treće strane.

4.1. Maven

Da bismo mogli koristiti Apache knjižnicu, moramo dodati ovisnost o našoj pom.xml:

 commons-codec commons-codec 1.14 

Najnoviju verziju gore navedenog možete pronaći na Maven Central.

4.2. Kodiranje

Koraci su isti kao i za Javu 8, samo što ovog puta svoje izvorne bajtove prenosimo na encodeBase64 metoda org.apache.commons.codec.binary.Base64 razred:

bajt [] inFileBytes = Files.readAllBytes (Putovi.get (IN_FILE)); bajt [] kodiran = org.apache.commons.codec.binary.Base64.encodeBase64 (inFileBytes); 

4.3. Streaming kodiranje

Ova knjižnica ne podržava strujanje kodiranja.

4.4. Dekodiranje

Opet, jednostavno zovemo decodeBase64 metodu i zapišite rezultat u datoteku:

bajt [] decoded = org.apache.commons.codec.binary.Base64.decodeBase64 (kodiran); FileOutputStream fos = novi FileOutputStream (OUT_FILE); fos.write (dekodirano); fos.flush (); fos.close (); 

5. Ispitivanje

Sada ćemo testirati naše kodiranje i dekodiranje pomoću jednostavnog JUnit testa:

javna klasa EncodeDecodeUnitTest {private static final String IN_FILE = // put do datoteke iz koje se kodira; privatni statički konačni niz OUT_FILE = // put do datoteke u koju se dekodira; privatni statički bajt [] inFileBytes; @BeforeClass javna statička void datotekaToByteArray () baca IOException {inFileBytes = Files.readAllBytes (Paths.get (IN_FILE)); } @Test javna praznina givenJavaBase64_whenEncoded_thenDecodedOK () baca IOException {byte [] encoded = java.util.Base64.getEncoder (). Encode (inFileBytes); bajt [] dekodirano = java.util.Base64.getDecoder (). dekodirano (kodirano); writeToFile (OUT_FILE, dekodiran); assertNotEquals (encoded.length, decoded.length); assertEquals (inFileBytes.length, decoded.length); assertArrayEquals (dekodirano, inFileBytes); } @Test javna praznina givenJavaBase64_whenEncodedStream_thenDecodedStreamOK () baca IOException {try (OutputStream os = java.util.Base64.getEncoder (). Wrap (new FileOutputStream (OUT_FILE) byFiteEput) novi bajt [1024]; int read; 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 (kodirano, kodiranoOnDisk); bajt [] dekodirano = java.util.Base64.getDecoder (). dekodirano (kodirano); bajt [] decodedOnDisk = java.util.Base64.getDecoder (). decode (encodedOnDisk); assertArrayEquals (dekodirano, dekodiranoOnDisk); } @Test javna praznina givenApacheCommons_givenJavaBase64_whenEncoded_thenDecodedOK () baca IOException {byte [] encoded = org.apache.commons.codec.binary.Base64.encodeBase64 (inFileBytes); bajt [] decoded = org.apache.commons.codec.binary.Base64.decodeBase64 (kodiran); writeToFile (OUT_FILE, dekodiran); assertNotEquals (encoded.length, decoded.length); assertEquals (inFileBytes.length, decoded.length); assertArrayEquals (dekodirano, inFileBytes); } private void writeToFile (StringName datoteke, bajt [] bajta) baca IOException {FileOutputStream fos = new FileOutputStream (fileName); fos.write (bajtovi); fos.flush (); fos.close (); }}

Kao što vidimo, prvo čitamo ulazne bajtove u a @BeforeClass metodu, i u obje naše @Test metode, potvrdio da:

  • kodirano i dekodiran bajtni nizovi su različite duljine
  • inFileBytes i dekodiran bajtni nizovi su iste duljine i imaju isti sadržaj

Naravno, također možemo otvoriti dekodiranu PDF datoteku koju smo stvorili i vidjeti da je sadržaj jednak datoteci koju smo dali kao ulaz.

6. Zaključak

U ovom smo brzom vodiču saznali više o Java-ovom uslužnom programu Base64.

Vidjeli smo i uzorke koda za pretvaranje PDF-a u i iz Base64 pomoću Java 8 i Apache Commons Codec. Zanimljivo je da je implementacija JDK puno brža od one Apache.

Kao i uvijek, izvorni kod dostupan je na GitHub-u.


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