別に PDF データに限らず Binaryデータを Base64 で文字列にして保存するという話。
時々必要になるがその度にあれどうするんだっけ、となるのでここにまとめておきます。
Groovy の LeftShift Operator (<<
) を IO 系のコードで使うと直感的にわかりやす過ぎなのでおすすめです。
encodeDecodePdf.groovy
@Grab(group='commons-codec', module='commons-codec', version='1.7')
import org.apache.commons.codec.binary.Base64
// PDFファイルの内容を base64文字列にエンコード
def toBase64EncodedString = { File pdfFile->
def inputStream = new FileInputStream(pdfFile)
def outputStram = new ByteArrayOutputStream()
outputStram << inputStream
return Base64.encodeBase64String(outputStram.toByteArray())
}
// 1)
def srcPdfFile = new File('src.pdf')
def base64str = toBase64EncodedString(srcPdfFile)
// 2)
def destPdfFile = new File('dest.pdf')
def byteArray = Base64.decodeBase64(base64str)
new FileOutputStream(destPdfFile) << new ByteArrayInputStream(byteArray)
PDFファイルを Base64文字列に encode して、それを再び decode して別ファイルに保存、という内容です。 実用上は Buffered 系のクラスを挟むべきと思います、それから close 処理も。 ここでは処理内容だけにフォーカスできるようにそのあたりは省いています。
今つくっているアプリで、大量のPDFファイルをキャッシュするときに MapDB が使おうと考えているのですが、 MapDB では Serializable な クラスしか永続化できないから(普通その手のアプリではそうだと思いますが)どうしようかと。 Serializable なクラスにするのが面倒なので、最初から Serializable なクラスである String に変換して保存しておけばいいや、という発想です。