Java Konverter PDF til Base64

1. Oversigt

I denne korte vejledning ser vi hvordan man laver Base64-kodning og afkodning af en PDF-fil ved hjælp af Java 8 og Apache Commons Codec.

Men lad os først kigge hurtigt på det grundlæggende i Base64.

2. Grundlæggende om Base64

Når vi sender data over ledningen, skal vi sende dem i binært format. Men hvis vi kun sender 0'er og 1'er, kan forskellige transportlagsprotokoller fortolke dem forskelligt, og vores data kan blive ødelagt under flyvning.

Så, for at have bærbarhed og fælles standarder under overførsel af binære data kom Base64 på billedet.

Da afsenderen og modtageren begge forstår og er enige om at bruge standarden, reduceres sandsynligheden for, at vores data går tabt eller fejlagtigt.

Lad os nu se et par måder at anvende dette på en PDF.

3. Konvertering ved hjælp af Java 8

Fra og med Java 8 har vi et hjælpeprogram java.util.Base64 der giver kodere og dekodere til Base64-kodningsskemaet. Det understøtter Basic, URL-sikre og MIME-typer som specificeret i RFC 4648 og RFC 2045.

3.1. Indkodning

For at konvertere en PDF til Base64 skal vi først hente den i bytes og send det igennem java.util.Base64.Encoder'S kode metode:

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

Her, IN_FIL er stien til vores input-PDF.

3.2. Streaming kodning

For større filer eller systemer med begrænset hukommelse, det er meget mere effektivt at udføre kodningen ved hjælp af en stream i stedet for at læse alle data i hukommelsen. Lad os se på, hvordan man opnår dette:

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

Her, IN_FIL er stien til vores input-PDF, og OUT_FILE er stien til en fil, der indeholder det Base64-kodede dokument. I stedet for at læse hele PDF'en i hukommelsen og derefter kode hele dokumentet i hukommelsen, læser vi op til 1Kb data ad gangen og sender disse data gennem koderen til OutputStream.

3.3. Afkodning

I den modtagende ende får vi den kodede fil.

Så det er nu nødvendigt afkode det for at få vores originale byte tilbage og skrive dem til en FileOutputStream for at få den afkodede PDF:

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

Her, OUT_FILE er stien til vores PDF, der skal oprettes.

4. Konvertering ved hjælp af Apache Commons

Dernæst bruger vi Apache Commons Codec-pakken til at opnå det samme. Det er baseret på RFC 2045 og går forud for Java 8-implementeringen, som vi diskuterede tidligere. Så når vi har brug for at understøtte flere JDK-versioner (inklusive ældre) eller leverandører, er dette nyttigt som en tredjeparts-API.

4.1. Maven

For at kunne bruge Apache-biblioteket skal vi tilføje en afhængighed af vores pom.xml:

 commons-codec commons-codec 1.14 

Den seneste version af ovenstående kan findes på Maven Central.

4.2. Indkodning

Trinene er de samme som for Java 8, bortset fra at vi denne gang videregiver vores originale bytes til encodeBase64 metode til 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 kodning

Streamingskodning understøttes ikke af dette bibliotek.

4.4. Afkodning

Igen kalder vi simpelthen afkodeBase64 metode og skriv resultatet til en fil:

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

5. Testning

Nu tester vi vores kodning og afkodning ved hjælp af en simpel JUnit-test:

offentlig klasse EncodeDecodeUnitTest {privat statisk endelig streng IN_FILE = // sti til fil, der skal kodes fra; privat statisk endelig streng OUT_FILE = // sti til fil, der skal afkodes til; privat statisk byte [] inFileBytes; @BeforeClass offentlig statisk ugyldig filToByteArray () kaster IOException {inFileBytes = Files.readAllBytes (Paths.get (IN_FILE)); } @Test offentlig ugyldighed givetJavaBase64_whenEncoded_thenDecodedOK () kaster IOException {byte [] kodet = java.util.Base64.getEncoder (). Kodning (inFileBytes); byte [] afkodet = java.util.Base64.getDecoder (). afkode (kodet); writeToFile (OUT_FILE, dekodet); assertNotEquals (kodet.længde, afkodet.længde); assertEquals (inFileBytes.length, decoded.length); assertArrayEquals (dekodet, inFileBytes); } @Test offentlig ugyldighed givetJavaBase64_whenEncodedStream_thenDecodedStreamOK () kaster IOException {prøv (OutputStream os = java.util.Base64.getEncoder (). Wrap (ny FileOutputStream (OUT_FILE)); FileInputStreamE = ny_fil) = INFILStreamE = FileInputStream fis =) ny byte [1024]; int læst; mens ((read = fis.read (bytes))> -1) {os.write (bytes, 0, read); }} byte [] kodet = java.util.Base64.getEncoder (). kodning (inFileBytes); byte [] encodedOnDisk = Files.readAllBytes (Paths.get (OUT_FILE)); assertArrayEquals (kodet, kodetOnDisk); byte [] afkodet = java.util.Base64.getDecoder (). afkode (kodet); byte [] dekodetOnDisk = java.util.Base64.getDecoder (). afkode (kodetOnDisk); assertArrayEquals (dekodet, dekodet OnDisk); } @ Test offentligt ugyldigt givenApacheCommons_givenJavaBase64_whenEncoded_thenDecodedOK () smider IOException {byte [] kodet = org.apache.commons.codec.binary.Base64.encodeBase64 (inFileBytes); byte [] afkodet = org.apache.commons.codec.binary.Base64.decodeBase64 (kodet); writeToFile (OUT_FILE, dekodet); assertNotEquals (kodet.længde, afkodet.længde); assertEquals (inFileBytes.length, decoded.length); assertArrayEquals (dekodet, inFileBytes); } privat ugyldigt writeToFile (streng filnavn, byte [] byte) kaster IOException {FileOutputStream fos = ny FileOutputStream (filnavn); fos.write (bytes); fos.flush (); fos.close (); }}

Som vi kan se, læser vi først inputbyte i a @BeforeClass metode, og i begge vores @Prøve metoder, verificeret at:

  • kodet og afkodet byte-arrays er af forskellige længder
  • inFileBytes og afkodet byte-arrays er af samme længde og har samme indhold

Selvfølgelig kan vi også åbne den dekodede PDF-fil, som vi oprettede, og se, at indholdet er det samme som den fil, vi gav som input.

6. Konklusion

I denne hurtige vejledning lærte vi mere om Java's Base64-værktøj.

Vi så også kodeeksempler til konvertering af en PDF til og fra Base64 ved hjælp af Java 8 og Apache Commons Codec. Interessant nok er JDK-implementeringen meget hurtigere end Apache-en.

Som altid er kildekoden tilgængelig på GitHub.


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