Rafał Rybacki Java Developer
Temat: Wypakowywanie PDF z pliku ZIP
W jednej z aplikacji pojawił się u mnie temat wypakowywania dokumentów PDF z pliku ZIP. Do obsługi PDF użyłem biblioteki iText 2.1.7. W pliku zip miałem kilkadziesiąt plików PDF. Aby rozpakować pliki do pamięci użyłem metody poniżej:
private static byte[] unzip(ZipFile zip, ZipEntry entry) throws IOException{
byte[] buffer = new byte[1024];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int count;
InputStream in = zip.getInputStream(entry);
while((count = in.read(buffer, 0, buffer.length)) != -1){
baos.write(buffer);
}
byte[] bytes = baos.toByteArray();
baos.close();
in.close();
return bytes;
}
Po wypakowaniu okazało się że klasa PdfReader nie jest w stanie otworzyć niektórych dokumentów PDF. Po kilku godzinach przeglądania stron i sprawdzaniu różnych wersji biblioteki iText doszedłem do wniosku żę wypakowane pliki PDF różnią się od oryginału (tak jakby "gubione" były jakieś bajty). W przypływie natchnienia wprowadziłem małą poprawkę w kodzie:
private static byte[] unzip(ZipFile zip, ZipEntry entry) throws IOException{
byte[] buffer = new byte[1024];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int count;
BufferedInputStream in = new BufferedInputStream(zip.getInputStream(entry));
while((count = in.read(buffer, 0, buffer.length)) != -1){
baos.write(buffer);
}
byte[] bytes = baos.toByteArray();
baos.close();
in.close();
return bytes;
}
i wszystko zaczęło działać.
Moje pytanko: czy ktoś ma pojęcie dlaczego rozwiązanie drugie jest poprawne podczas gdy pierwsze nie? A może drugie rozwiązanie też jest błędne w jakiś szczególnych przypadkach? Chciałbym wiedzieć czemu tak jest, żeby w przyszłości znów nie musieć eksperymentować :P. Może jakieś linki odnośnie działania strumieni?
Pozdrawiam