Sunday, July 1, 2018 / Groovy, PDF

MapDB に PDF を保存する、そのために PDFデータを Base64 文字列に encode したり decode したりの話

別に 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 out = new ByteArrayOutputStream()
    out << inputStream

    def byteArray = out.toByteArray()
    return Base64.encodeBase64String(byteArray)
}


// 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 に変換して保存しておけばいいや、という発想です。