2013-05-02 8 views
5

Próbuję odczytać zawartość pliku PDF za pomocą modułu PDFBox Apache i zakodować go w base64, aby móc go przesłać strumieniowo w inne miejsce. Aby go zakodować, używam klasy commache Base64OutputStream. Jak tak,Testy Junit dla kodu zakodowanego w 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()); 

Wydaje się kodującego go, ale trzeba go zweryfikować poprzez napisanie testu junit aby sprawdzić poprawność ciąg base64. Wydaje się, że poniższe zdania nie mijają. Jakieś pomysły ?

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

góry dzięki

+1

Używanie wspólnego apache w "assertTrue (Base64.isBase64 (treść));" wydaje się działać dobrze. Czy ktoś może rzucić trochę światła na to, dlaczego regex nie działa? – nixgadgets

+0

To dokładne wyrażenie działa dla mnie, próbowałem zrobić mały kod Java, aby go przetestować. Kompiluje się i działa poprawnie zarówno w Javie 6, jak i Java 7. https://gist.github.com/melwil/5508003 – melwil

+1

Może napotkasz na łamanie linii? Lub brak dopełnienia z '='? Być może '+' może zostać przetłumaczone na przestrzeń w transporcie HTTP. –

Odpowiedz

3

Domyślnie Base64OutputStream stosuje CHUNK_SIZE = 76 i CHUNK_SEPARATOR = { '\ r' "\ n}. Wyrażenie regularne, którego używasz do sprawdzenia, czy dany ciąg ma kodowanie BASE64, nie uwzględnia tego.

wyrażenie regularne dopasowujące pakietowego BASE64 (o podanym wielkość porcji 64 i separator \ r \ n) łańcuch może wyglądać następująco:

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