Java PDF converteren naar Base64

1. Overzicht

In deze korte tutorial zullen we zien hoe u Base64-codering en decodering van een PDF-bestand uitvoert met Java 8 en Apache Commons Codec.

Maar laten we eerst even kijken naar de basisprincipes van Base64.

2. Basisprincipes van Base64

Bij het verzenden van gegevens over de draad, moeten we deze in het binaire formaat verzenden. Maar als we alleen nullen en enen sturen, kunnen verschillende transportlaagprotocollen ze anders interpreteren en kunnen onze gegevens tijdens de vlucht beschadigd raken.

Zo, Om draagbaarheid en gemeenschappelijke standaarden te hebben bij het overdragen van binaire gegevens, kwam Base64 in beeld.

Omdat de afzender en de ontvanger beide de standaard begrijpen en ermee hebben ingestemd, is de kans dat onze gegevens verloren gaan of verkeerd worden geïnterpreteerd, aanzienlijk kleiner.

Laten we nu een aantal manieren bekijken om dit op een pdf toe te passen.

3. Conversie met behulp van Java 8

Vanaf Java 8 hebben we een hulpprogramma java.util.Base64 die encoders en decoders biedt voor het Base64-coderingsschema. Het ondersteunt basis-, URL-veilige en MIME-typen zoals gespecificeerd in RFC 4648 en RFC 2045.

3.1. Codering

Om een ​​PDF naar Base64 te converteren, moeten we deze eerst in bytes en geef het door java.util.Base64.Encoder‘S coderen methode:

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

Hier, IN BESTAND is het pad naar onze invoer-pdf.

3.2. Streaming-codering

Voor grotere bestanden of systemen met beperkt geheugen, het is veel efficiënter om de codering uit te voeren met een stream in plaats van alle gegevens in het geheugen te lezen. Laten we eens kijken hoe we dit kunnen bereiken:

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

Hier, IN BESTAND is het pad naar onze invoer-pdf, en OUT_FILE is het pad naar een bestand dat het met Base64 gecodeerde document bevat. In plaats van de volledige PDF in het geheugen te lezen en vervolgens het volledige document in het geheugen te coderen, lezen we tot 1 KB aan gegevens per keer en sturen die gegevens door de encoder naar de OutputStream.

3.3. Decodering

Aan de ontvangende kant krijgen we het gecodeerde bestand.

Dus we moeten nu decodeer het om onze originele bytes terug te krijgen en schrijf ze naar een FileOutputStream om de gedecodeerde PDF te krijgen:

byte [] gedecodeerd = java.util.Base64.getDecoder (). decoderen (gecodeerd); FileOutputStream fos = nieuwe FileOutputStream (OUT_FILE); fos.write (gedecodeerd); fos.flush (); fos.close ();

Hier, OUT_FILE is het pad naar onze te maken PDF.

4. Conversie met Apache Commons

Vervolgens gebruiken we het Apache Commons Codec-pakket om hetzelfde te bereiken. Het is gebaseerd op RFC 2045 en dateert van vóór de Java 8-implementatie die we eerder hebben besproken. Dus als we meerdere JDK-versies (inclusief legacy-versies) of leveranciers moeten ondersteunen, is dit handig als API van derden.

4.1. Maven

Om de Apache-bibliotheek te kunnen gebruiken, moeten we een afhankelijkheid toevoegen aan onze pom.xml:

 commons-codec commons-codec 1.14 

De nieuwste versie van het bovenstaande is te vinden op Maven Central.

4.2. Codering

De stappen zijn hetzelfde als voor Java 8, behalve dat we deze keer onze originele bytes doorgeven aan het encodeBase64 methode van de org.apache.commons.codec.binary.Base64 klasse:

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

4.3. Streaming-codering

Streaming-codering wordt niet ondersteund door deze bibliotheek.

4.4. Decodering

Nogmaals, we noemen gewoon de decodeBase64 methode en schrijf het resultaat naar een bestand:

byte [] gedecodeerd = org.apache.commons.codec.binary.Base64.decodeBase64 (gecodeerd); FileOutputStream fos = nieuwe FileOutputStream (OUT_FILE); fos.write (gedecodeerd); fos.flush (); fos.close (); 

5. Testen

Nu zullen we onze codering en decodering testen met behulp van een eenvoudige JUnit-test:

openbare klasse EncodeDecodeUnitTest {privé statische laatste String IN_FILE = // pad naar bestand waaruit moet worden gecodeerd; private static final String OUT_FILE = // pad naar bestand waarin moet worden gedecodeerd; privé statische byte [] inFileBytes; @BeforeClass openbare statische leegte fileToByteArray () gooit IOException {inFileBytes = Files.readAllBytes (Paths.get (IN_FILE)); } @Test openbare ongeldige gegevenJavaBase64_whenEncoded_thenDecodedOK () gooit IOException {byte [] gecodeerd = java.util.Base64.getEncoder (). Codering (inFileBytes); byte [] gedecodeerd = java.util.Base64.getDecoder (). decoderen (gecodeerd); writeToFile (OUT_FILE, gedecodeerd); assertNotEquals (encoded.length, decoded.length); assertEquals (inFileBytes.length, decoded.length); assertArrayEquals (gedecodeerd, inFileBytes); } @Test openbare ongeldige gegevenJavaBase64_whenEncodedStream_thenDecodedStreamOK () gooit IOException {probeer (OutputStream os = java.util.Base64.getEncoder (). Wrap (nieuwe FileOutputStream (OUT_FILE)); FileInputStream (nieuw) INPUTFis = nieuw nieuwe byte [1024]; int gelezen; while ((read = fis.read (bytes))> -1) {os.write (bytes, 0, read); }} byte [] gecodeerd = java.util.Base64.getEncoder (). codering (inFileBytes); byte [] encodedOnDisk = Files.readAllBytes (Paths.get (OUT_FILE)); assertArrayEquals (gecodeerd, encodedOnDisk); byte [] gedecodeerd = java.util.Base64.getDecoder (). decoderen (gecodeerd); byte [] decodedOnDisk = java.util.Base64.getDecoder (). decoderen (encodedOnDisk); assertArrayEquals (gedecodeerd, decodedOnDisk); } @Test openbare leegte gegevenApacheCommons_givenJavaBase64_whenEncoded_thenDecodedOK () gooit IOException {byte [] gecodeerd = org.apache.commons.codec.binary.Base64.encodeBase64 (inFileBytes); byte [] gedecodeerd = org.apache.commons.codec.binary.Base64.decodeBase64 (gecodeerd); writeToFile (OUT_FILE, gedecodeerd); assertNotEquals (encoded.length, decoded.length); assertEquals (inFileBytes.length, decoded.length); assertArrayEquals (gedecodeerd, inFileBytes); } private void writeToFile (String bestandsnaam, byte [] bytes) gooit IOException {FileOutputStream fos = nieuwe FileOutputStream (bestandsnaam); fos.write (bytes); fos.flush (); fos.close (); }}

Zoals we kunnen zien, lezen we eerst de invoerbytes in een @Voor klas methode, en in beide onze @Test methoden, geverifieerd dat:

  • gecodeerd en gedecodeerd byte-arrays hebben verschillende lengtes
  • inFileBytes en gedecodeerd byte-arrays hebben dezelfde lengte en dezelfde inhoud

Natuurlijk kunnen we ook het gedecodeerde PDF-bestand dat we hebben gemaakt openen en zien dat de inhoud hetzelfde is als het bestand dat we als invoer hebben opgegeven.

6. Conclusie

In deze korte tutorial hebben we meer geleerd over Java's Base64-hulpprogramma.

We zagen ook codevoorbeelden voor het converteren van een PDF van en naar Base64 met behulp van Java 8 en Apache Commons Codec. Interessant is dat de JDK-implementatie veel sneller is dan de Apache-implementatie.

Zoals altijd is de broncode beschikbaar op GitHub.


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