Rafał Rybacki

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

konto usunięte

Temat: Wypakowywanie PDF z pliku ZIP

Strumienie w javie są czymś naprawdę dziwnym ;). Istnieje ich tyle, że nie zawsze wiadomo czego użyć. Nie znam odpowiedzi na Twoje pytanie, ale na pewno ją znajdziesz jak więcej poczytasz o samych strumieniach. Może Thinking in Java Ci pomoże.

konto usunięte

Temat: Wypakowywanie PDF z pliku ZIP

Rafał Rybacki:
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;
}


A co w przypadku gdy read() wczyta mniejszą ilość bajtów niż buffer.length? Wydaje mi się , że zapis powinien odbywać się tak, bo inaczej do baos dopiszesz jakieś śmieci:


while((count = in.read(buffer, 0, buffer.length)) != -1){
baos.write(buffer, 0, count);
}


Pozdr!Szymon Ulewicz edytował(a) ten post dnia 30.03.12 o godzinie 11:08
Rafał Rybacki

Rafał Rybacki Java Developer

Temat: Wypakowywanie PDF z pliku ZIP

Masz rację, być może to było też powodem dlaczego nie działał zwykły InputStream, zaraz sobie potestuje :)

Dzięki :)

---
PS. Rzeczywiście, wyszło na to że zapisywałem do tablicy bajtów nadmiarowe dane. Teraz działa również ze zwykłym InputStream. Nie ma to jak porada fachowca :) Jeszcze raz dzięki :)Rafał Rybacki edytował(a) ten post dnia 30.03.12 o godzinie 11:47

Następna dyskusja:

Czytanie z pliku ==> dzi...




Wyślij zaproszenie do