Java Konverter PDF til Base64

1. Oversikt

I denne korte opplæringen får vi se hvordan du gjør Base64-koding og dekoding av en PDF-fil ved hjelp av Java 8 og Apache Commons Codec.

Men først, la oss ta en rask titt på det grunnleggende om Base64.

2. Grunnleggende om Base64

Når vi sender data over ledningen, må vi sende dem i binært format. Men hvis vi bare sender 0 og 1, kan forskjellige transportlagsprotokoller tolke dem annerledes, og dataene våre kan bli ødelagt under flyturen.

Så, å ha bærbarhet og felles standarder mens du overfører binære data, kom Base64 på bildet.

Siden både avsender og mottaker forstår og er enige om å bruke standarden, blir sannsynligheten for at dataene våre går tapt eller feiltolkes sterkt redusert.

La oss nå se et par måter å bruke dette på en PDF.

3. Konvertering ved hjelp av Java 8

Fra og med Java 8 har vi et verktøy java.util.Base64 som gir kodere og dekodere for Base64-kodingsskjemaet. Den støtter Basic, URL-sikre og MIME-typer som spesifisert i RFC 4648 og RFC 2045.

3.1. Koding

For å konvertere en PDF til Base64, må vi først få den i byte og passere den gjennom java.util.Base64.Encoder‘S kode metode:

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

Her, IN_FIL er veien til vår input PDF.

3.2. Streaming koding

For større filer eller systemer med begrenset minne, det er mye mer effektivt å utføre kodingen ved hjelp av en strøm i stedet for å lese alle dataene i minnet. La oss se på hvordan vi kan oppnå dette:

prøv (OutputStream os = java.util.Base64.getEncoder (). wrap (ny FileOutputStream (OUT_FILE)); FileInputStream fis = ny FileInputStream (IN_FILE)) {byte [] byte = ny byte [1024]; int lese; mens ((read = fis.read (bytes))> -1) {os.write (bytes, 0, read); }}

Her, IN_FIL er veien til vår input PDF, og OUT_FILE er stien til en fil som inneholder det Base64-kodede dokumentet. I stedet for å lese hele PDF-en i minnet og deretter kode hele dokumentet i minnet, leser vi opptil 1Kb data om gangen og sender disse dataene gjennom koderen til OutputStream.

3.3. Dekoding

I mottakersiden får vi den kodede filen.

Så vi må nå dekode den for å få tilbake de opprinnelige byte og skrive dem til en FileOutputStream for å få den dekodede PDF-filen:

byte [] dekodet = java.util.Base64.getDecoder (). dekode (kodet); FileOutputStream fos = ny FileOutputStream (OUT_FILE); fos.write (dekodet); fos.flush (); fos.close ();

Her, OUT_FILE er veien til PDF-en vår som skal opprettes.

4. Konvertering ved hjelp av Apache Commons

Deretter bruker vi Apache Commons Codec-pakken for å oppnå det samme. Den er basert på RFC 2045 og går forut for Java 8-implementeringen vi diskuterte tidligere. Så når vi trenger å støtte flere JDK-versjoner (inkludert eldre versjoner) eller leverandører, kommer dette til nytte som et tredjeparts-API.

4.1. Maven

For å kunne bruke Apache-biblioteket, må vi legge til en avhengighet til vårt pom.xml:

 commons-codec commons-codec 1.14 

Den siste versjonen av ovennevnte finner du på Maven Central.

4.2. Koding

Trinnene er de samme som for Java 8, bortsett fra at denne gangen viderefører vi de opprinnelige bytene til encodeBase64 metoden for org.apache.commons.codec.binary.Base64 klasse:

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

4.3. Streaming koding

Streaming-koding støttes ikke av dette biblioteket.

4.4. Dekoding

Igjen kaller vi bare dekodeBase64 metode og skriv resultatet til en fil:

byte [] dekodet = org.apache.commons.codec.binary.Base64.decodeBase64 (kodet); FileOutputStream fos = ny FileOutputStream (OUT_FILE); fos.write (dekodet); fos.flush (); fos.close (); 

5. Testing

Nå skal vi teste koding og dekoding ved hjelp av en enkel JUnit-test:

offentlig klasse EncodeDecodeUnitTest {privat statisk sluttstreng IN_FILE = // sti til filen som skal kodes fra; privat statisk slutt String OUT_FILE = // sti til fil som skal dekodes til; privat statisk byte [] inFileBytes; @BeforeClass offentlig statisk ugyldig filToByteArray () kaster IOException {inFileBytes = Files.readAllBytes (Paths.get (IN_FILE)); } @Test offentlig ugyldighet gittJavaBase64_whenEncoded_thenDecodedOK () kaster IOException {byte [] kodet = java.util.Base64.getEncoder (). Koding (inFileBytes); byte [] dekodet = java.util.Base64.getDecoder (). dekode (kodet); writeToFile (OUT_FILE, dekodet); assertNotEquals (kodet.lengde, dekodet.lengde); assertEquals (inFileBytes.length, decoded.length); assertArrayEquals (dekodet, inFileBytes); } @Test offentlig ugyldig gittJavaBase64_whenEncodedStream_thenDecodedStreamOK () kaster IOException {try (OutputStream os = java.util.Base64.getEncoder (). Wrap (ny FileOutputStream (OUT_FILE)); FileInputStreamE = ny_fil_) ny byte [1024]; int lese; mens ((read = fis.read (bytes))> -1) {os.write (bytes, 0, read); }} byte [] kodet = java.util.Base64.getEncoder (). koding (inFileBytes); byte [] encodedOnDisk = Files.readAllBytes (Paths.get (OUT_FILE)); assertArrayEquals (kodet, kodetOnDisk); byte [] dekodet = java.util.Base64.getDecoder (). dekode (kodet); byte [] decodedOnDisk = java.util.Base64.getDecoder (). dekode (kodetOnDisk); assertArrayEquals (dekodet, dekodet OnDisk); } @Test offentlig ugyldighet givenApacheCommons_givenJavaBase64_whenEncoded_thenDecodedOK () kaster IOException {byte [] kodet = org.apache.commons.codec.binary.Base64.encodeBase64 (inFileBytes); byte [] dekodet = org.apache.commons.codec.binary.Base64.decodeBase64 (kodet); writeToFile (OUT_FILE, dekodet); assertNotEquals (kodet.lengde, dekodet.lengde); assertEquals (inFileBytes.length, decoded.length); assertArrayEquals (dekodet, inFileBytes); } privat ugyldig writeToFile (streng filnavn, byte [] byte) kaster IOException {FileOutputStream fos = ny FileOutputStream (filnavn); fos.write (byte); fos.flush (); fos.close (); }}

Som vi kan se, leser vi først inngangsbyte i a @BeforeClass metode, og i begge våre @Test metoder, bekreftet at:

  • kodet og dekodet byte-matriser er av forskjellige lengder
  • inFileBytes og dekodet byte-matriser er av samme lengde og har samme innhold

Selvfølgelig kan vi også åpne den dekodede PDF-filen som vi opprettet, og se at innholdet er det samme som filen vi ga som input.

6. Konklusjon

I denne raske opplæringen lærte vi mer om Java Base64-verktøy.

Vi så også kodeeksempler for konvertere en PDF til og fra Base64 ved hjelp av Java 8 og Apache Commons Codec. Interessant, JDK-implementeringen er mye raskere enn Apache-en.

Som alltid er kildekoden tilgjengelig på GitHub.


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