2013-05-02 117 views
5

我正在嘗試使用Apache的PDFBox讀取PDF的內容並將其編碼爲base64,因此我可以將它流式傳輸到其他地方。爲了對它進行編碼,我使用Apache commons Base64OutputStream類。像這樣,Junit測試base64編碼字符串

ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(); 
Base64OutputStream base64Output = new Base64OutputStream(byteOutput); 
List pages = pdfDocument.getDocumentCatalog().getAllPages(); 
Iterator iter = pages.iterator(); 
while (iter.hasNext()) { 
    PDPage page = (PDPage) iter.next(); 
    PDResources resources = page.getResources(); 
    Map<String, PDXObjectImage> pageImages = resources.getImages(); 
    if (pageImages != null) { 
    Iterator imageIter = pageImages.keySet().iterator(); 
    while (imageIter.hasNext()) { 
     String key = (String) imageIter.next(); 
     PDXObjectImage image = (PDXObjectImage) pageImages 
      .get(key); 
     image.write2OutputStream(base64Output); 
    } 
    } 
} 
String base64 = new String(byteOutput.toByteArray()); 

它似乎是編碼,但我需要通過編寫一個junit測試來驗證base64字符串來驗證它。以下似乎並沒有通過它。有什麼想法嗎 ?

assertTrue(content 
     .matches("^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$")); 

預先感謝

+1

使用Apache常見的 「assertTrue(Base64.isBase64(內容));」似乎工作得很好。有人可以澄清爲什麼正則表達式不起作用嗎? – nixgadgets 2013-05-03 00:11:03

+0

這確切的正則表達式適用於我,我試着做一個小的Java存根(stub)來測試它。它在Java 6和Java 7中編譯並運行成功。 https://gist.github.com/melwil/5508003 – melwil 2013-05-03 11:07:28

+1

也許你遇到換行符?或缺少'='填充?可能「+」可能會被轉換爲HTTP傳輸中的空間。 – 2013-05-03 11:37:39

回答

3

默認Base64OutputStream使用CHUNK_SIZE = 76,和CHUNK_SEPARATOR = { '\ r', '\ n'}。 正在使用的正則表達式來測試給定的字符串是否是BASE64編碼的,並不能說明這一點。

正則表達式匹配分塊BASE64(具有給定的塊大小64和分離器\ r \ n)的字符串可能看起來像這樣:

"^(([\\w+/]{4}){19}\r\n)*(([\\w+/]{4})*([\\w+/]{4}|[\\w+/]{3}=|[\\w+/]{2}==))$"