Lesebefehl für Word Document in C89/C99?
-
Hi!
Ich weiß dass die interne Struktur eines Word Documents sehr komplex ist. Gibt es irgendeine Möglichkeit in ANSI C, den Text eines solchen Dokuments mit einem Programm auszulesen? Oder geht das nur mit Open Format Dateien?
Vielen Dank & Gruß
jesse
-
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum C (C89 und C99) in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Das geht mit fgetc, fread.
Dann das Leseergebnis gemäß dem Wordformat interpretieren und so Text von Formatierung trennen.
-
Verschoben wie unfair.
Wollte der Threadstarter nicht programmitisch das Worddok auslesen?LibreOffice
-
Klar geht das. Hier ein einfaches Beispiel das einfach alle "anzeigbaren" Zeichen im Dokument ausgibt:
#include <stdio.h> #include <ctype.h> int main(int argc, char *argv[]) { FILE *doc; int ch; if (argc != 2) { fprintf(stderr, "Das Programm erwartet genau ein Argument: den Pfad zu einem Word-Dokument.\n"); return 1; } doc = fopen(argv[1], "r"); if (!doc) { fprintf(stderr, "Kann Datei %s nicht öffnen!\n", argv[1]); return 1; } while (EOF != (ch = fgetc(doc))) if (isprint(ch)) fputc(ch, stdout); return 0; }
-
Bei mir kommt nur Kokolores dabei raus. Der reine Text scheint verschlüsselt zu sein d.h. nicht abdruckbar. Wenn ich in einem DOS-Fenster "type test.docx" drücke, zeigt er mir keine abdruckbaren Zeichen an.
-
Ein DOCX ist ein Zip-Archiv, welches XML-Dateien, die das Word-Dokument beschreiben, enthält.
Die wichtigste Teildatei ist die document.xml mit dem eigentlichen Dokumentinhalt.
Um an den Text zu kommen musst du nun die Datei mit einer Zip-Library öffnen und die XML-Datei einlesen und durch einen XML-Parser schieben. Die w:t-Knoten enthalten den reinen unformatierten Text. Wenn du noch ein bisschen Struktur willst, kannst du auch noch Absätze berücksichtigen (w:p).
Beispiel document.xml:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <w:document [...]> <w:body> <w:p w:rsidR="00661DEE" w:rsidRDefault="008145CE"> <w:r> <w:t>Erste Zeile.</w:t> </w:r> </w:p> <w:p w:rsidR="008145CE" w:rsidRDefault="008145CE"> <w:r> <w:t xml:space="preserve">Zweite Zeile mit einem </w:t> </w:r> <w:bookmarkStart w:id="0" w:name="_GoBack" /> <w:r w:rsidRPr="008145CE"> <w:rPr> <w:b /> </w:rPr> <w:t>fetten Wort</w:t> </w:r> <w:bookmarkEnd w:id="0" /> <w:r> <w:t>.</w:t> </w:r> </w:p> <w:sectPr w:rsidR="008145CE"> <w:pgSz w:w="11906" w:h="16838" /> <w:pgMar w:top="1417" w:right="1417" w:bottom="1134" w:left="1417" w:header="708" w:footer="708" w:gutter="0" /> <w:cols w:space="708" /> <w:docGrid w:linePitch="360" /> </w:sectPr> </w:body> </w:document>
Siehe auch:
http://en.wikipedia.org/wiki/Open_Packaging_Conventions
http://en.wikipedia.org/wiki/Office_Open_XML
-
Hier findest du die Dokumente zum OfficeOpenXML-Standard: http://www.ecma-international.org/publications/standards/Ecma-376.htm
Wenn du wissen willst, welcher XML-Tag was bedeutet, musst du in Part 4 des Standards gucken. Im Overview wird auch auf Einführungen verwiesen.
-
Vielen Dank für die tolle Erklärung.
-
Wenn man unter Windows unterwegs ist und etwas Ahnung von COM hat, kann man auch einfach per COM eine Instanz von Word.Application erstellen und damit auf das Dokument zugreifen. Das funktioniert auch für die älteren doc-Formate.