2013-05-02 11 views
5

Sto provando a leggere il contenuto di un PDF utilizzando il PDFBox di Apache e lo codifico in base64 in modo da poterlo riversare altrove. Per codificarlo, utilizzo la classe Base64OutputStream di Apache commons. Come così,Test di Junit per la stringa codificata in 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()); 

Sembra essere la codifica, ma ho bisogno di verificarlo scrivendo un test JUnit per convalidare la stringa base64. Il seguente non sembra passarlo. Qualche idea ?

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

Grazie in anticipo

+1

usando Apache del comune "assertTrue (Base64.isBase64 (tenore));" sembra funzionare bene. Qualcuno può per favore far luce sul motivo per cui la regex non funziona? – nixgadgets

+0

L'esatta regex funziona per me, ho provato a creare un piccolo stub java per testarlo. Compila e funziona correttamente sia in Java 6 che in Java 7. https://gist.github.com/melwil/5508003 – melwil

+1

Forse hai riscontrato interruzioni di riga? O manca il riempimento con '='? Forse '+' potrebbe essere tradotto nello spazio nel trasporto HTTP. –

risposta

3

Per impostazione predefinita Base64OutputStream sta usando chunk_size = 76, e CHUNK_SEPARATOR = { '\ r', '\ n'}. L'espressione regolare che si sta utilizzando per verificare se una stringa data è codificata in BASE64 non tiene conto di ciò.

un'espressione regolare per trovare chunked BASE64 (con data dimensione del blocco 64 e il separatore \ r \ n) stringa potrebbe essere la seguente:

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