Toon posts:

[Java] Open docx file uit zip file

Pagina: 1
Acties:

Onderwerpen


  • lensy
  • Registratie: februari 2009
  • Laatst online: 03-10-2020
Hallo,

Ik probeer een hoop docx bestanden uit een zipfile te lezen, maar ik geraak er maar niet aan uit...

Ik gebruik de java.util.zip lib om de docx bestanden en zipfiles te lezen, en dit lukt wel apart. Nu moet een ZipFile een File hebben als input (http://download.oracle.co...a/util/zip/ZipFile.html), maar het lukt mij niet om de inhoud van de zip file naar een File te krijgen.

Zo probeer ik het en lukt het niet:
code:
1
2
3
Enumeration entries = docxFiles.entries();
String fileName = ((ZipEntry)entries.nextElement()).getName();
ZipFile docxFile = new ZipFile(fileName);

Natuurlijk heeft File een pathname nodig als argument, maar hoe zou het mij dan lukken om de docx te lezen uit de zip file? Moet ik hem misschien eerst ergens unzippen?

Alvast bedankt!

  • Herko_ter_Horst
  • Registratie: november 2002
  • Niet online
Wat probeer je nou te doen? Je verhaal zegt "docx uit een zipfile", je code lijkt te zeggen "zipfiles uit een docx".

Een ZipFile heeft ZipEntries, dat zijn geen Files, maar alleen maar metadata van elke entry in de zip file. Met een ZipEntry kun je de ZipFile om een inputstream vragen. Die kun je vervolgens wegschrijven naar disk om het ongecomprimeerde bestand te krijgen.

Verder had je even moeten Googlen, er zijn tig voorbeelden te vinden. O.a. in de officiele documentatie: http://java.sun.com/devel.../Programming/compression/

PS ik neem niet aan dat je Java 1.4 gebruikt, kijk dan ook even in de juiste versie van de API docs: http://download.oracle.com/javase/6/docs/api/ (nou is er aan ZipFiles niet zoveel veranderd sinds 1.4, maar in het algemeen is het handiger om de juiste versie van de docs te pakken)

[Voor 58% gewijzigd door Herko_ter_Horst op 06-11-2010 23:45]

"Any sufficiently advanced technology is indistinguishable from magic."


  • lensy
  • Registratie: februari 2009
  • Laatst online: 03-10-2020
"docxFiles" is dus het zip bestand waarin de docx bestanden zitten, mijn titel klopt weldegelijk.
Jij zegt dus dat ik eerst moet wegschrijven naar disk om het bestand dan te openen, dat wou ik dus weten :)

Dat in de officiële documentatie had ik ook gevonden btw.

Toch bedankt!

  • Macros
  • Registratie: februari 2000
  • Laatst online: 05-08 22:30

Macros

I'm watching...

Ligt eraan wat je met die docx bestanden wilt doen. Je hoeft ze niet naar disk te schrijven eerst. De stream die je terug kan krijgen van een ZipEntry kan je direct gebruiken.

"Beauty is the ultimate defence against complexity." David Gelernter


  • lensy
  • Registratie: februari 2009
  • Laatst online: 03-10-2020
Gewoon direct uitlezen in feite. Kan ik de XML structuur van de docx direct gebruiken in de stream?

  • Devilly
  • Registratie: januari 2009
  • Niet online
Een antwoord op je vraag heb ik niet, maar het lijkt mij sowieso veel makkelijker om gebruik te maken van iets als http://poi.apache.org/index.html.

  • Janoz
  • Registratie: oktober 2000
  • Laatst online: 13:46

Janoz

Moderator Devschuur®

!litemod

Herko_ter_Horst schreef op zaterdag 06 november 2010 @ 23:34:
Een ZipFile heeft ZipEntries, dat zijn geen Files, maar alleen maar metadata van elke entry in de zip file. Met een ZipEntry kun je de ZipFile om een inputstream vragen. Die kun je vervolgens wegschrijven naar disk om het ongecomprimeerde bestand te krijgen gebruiken om je data te krijgen.
Zo gefixed. Er is in principe helemaal gen noodzaak om het bestand tijdelijk weg te schrijven. De topicstarter is op de verkeerde plek op zoek naar de ontkoppeling. Die ligt namelijk niet bij File, maar bij de stream. De stream die je uit je zipentry krijgt kun je net zo goed in je dom, sax of eigen parser gebruiken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • lensy
  • Registratie: februari 2009
  • Laatst online: 03-10-2020
@Janoz: Voorlopig open ik de docx files uit de zip file ook met de ZipFile klasse. Deze moet echter een File of filenaam hebben als parameter. Het lukt mij niet om dit uit de inputstream te halen... Enige suggesties?
code:
1
2
3
4
5
6
7
8
ZipFile docxFiles = new ZipFile(new File(zipFile));
Enumeration entries = docxFiles.entries();
String fileName = ((ZipEntry)entries.nextElement()).getName();

ZipFile docxFile = new ZipFile(fileName);
ZipEntry documentXML = docxFile.getEntry("word/document.xml");
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = factory.createXMLStreamReader(docxFile.getInputStream(documentXML));


@Devilly: Die apache pio ben ik nu aan het uitproberen, thx.

  • terje7601
  • Registratie: september 2009
  • Laatst online: 07-04 10:06
java.util.zip.ZipInputStream gebruiken?

[Voor 14% gewijzigd door terje7601 op 07-11-2010 13:05]


  • Herko_ter_Horst
  • Registratie: november 2002
  • Niet online
Janoz schreef op zondag 07 november 2010 @ 10:06:
[...]


Zo gefixed. Er is in principe helemaal gen noodzaak om het bestand tijdelijk weg te schrijven. De topicstarter is op de verkeerde plek op zoek naar de ontkoppeling. Die ligt namelijk niet bij File, maar bij de stream. De stream die je uit je zipentry krijgt kun je net zo goed in je dom, sax of eigen parser gebruiken.
Als de TS duidelijk had gemaakt wat hij van plan was, dan had ik als voorbeeld "kun je aan een parser voeren" gebruikt, in plaats van "kun je naar File wegschrijven"... Dus "gefixed"... tsja, met de info die de TS later gaf wel.

@TS zoals gezegd: ZipInputStream i.p.v. ZipFile gebruiken om de inhoud van de docx te pakken te krijgen. Hoe dit moet staat overigens ook in de documentatie waar ik al eerder naar linkte.

"Any sufficiently advanced technology is indistinguishable from magic."

Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee