docx4j Erste Schritte

Die neueste Version dieses Dokuments finden Sie immer gefunden werden, in docx4j svn in /docs (In Flat OPC XML Format für Word 2007, HTML Und PDF ).

Dieses Dokument wurde aus dem Englischen übersetzt mit Google Translate. Wenn Sie die Übersetzung verbessern können, zögern Sie bitte in Ihrem verbesserte Version senden. Für die jüngsten, immer auf die englische Version verweisen.

Was ist docx4j?

docx4j ist eine Bibliothek zum Entpacken ein docx-"Paket" und Parsen der XML WordprocessingML eine In-Memory-Vertretung in erstellen Java . Neuere Versionen von docx4j unterstützen auch Powerpoint-Dateien pptx.

Es ist vom Konzept her ähnlich zu Microsofts OpenXML SDK, das für sich. NET.

docx4j ist Open Source unter der Apache License (v2) erhältlich. Als Open-Source-Projekt, sind Beiträge willkommen. Bitte beachten Sie die docx4j Forum auf http://dev.plutext.org/forums/ für weitere Details.

docx4j stützt sich stark auf JAXB, Der JCP-Standard für Java XML bindend. Sie können denken docx4j als JAXB Umsetzung (ua):

* Open Packaging Conventions

* WordprocessingML (DOCX), Teil des Open XML

* Presentation ML (pptx) part of OpenXML

Die Bibliothek ist so konzipiert, Reise docx-Dateien mit 100% Fidelity Runde, und unterstützt alle 2007 WordML. Support für neue Word 2010 verfügt werden in Kürze hinzugefügt.

Der docx4j Projekt wird gefördert durch Plutext (www.plutext.com ).

Ist docx4j für Sie?

docx4j ist für die Verarbeitung docx-Dokumente (und pptx Präsentationen) in Java.

Es ist nicht für die alten binären (. Doc-Dateien). Für diejenigen, Blick auf Apache POI's HWPF. (In der Tat, docx4j verwendet HWPF für grundlegende Umwandlung von. doc zu. docx)

Auch ist es für RTF-Dateien.

Wenn Sie auf docx-Dokumente auf dem. NET-Plattform verarbeiten möchten, sollten Sie auf Microsofts OpenXML SDK statt zu suchen.

Eine Alternative zu docx4j Apache POI ist. Ich würde empfehlen, besonders für die Bearbeitung von Excel-Dokumenten. Es kann auch verwendet werden, um Word-Dokumente verarbeiten, und da es benutzt XMLBeans (nicht JAXB) kann es eine bessere Wahl sein, wenn Sie XMLBeans verwenden möchten.

Welche Art von Dingen kann man mit docx4j?

* Open bestehenden docx (aus Dateisystem, SMB / CIFS, WebDAV VFS)

* Neues docx

* programmgesteuert manipulieren die docx-Dokument (natürlich)

* Template substitution; CustomXML binding

* Import eine binäre doc (verwendet Apache POI HWPF)

* Produce / verbrauchen Word 2007 ist xmlPackage (PKG)-Format

* docx zu speichern gezippt Dateisystem als docx (IE), oder JCR (ungepackt)

* Apply verwandelt, einschließlich gemeinsamer Filter

* Export als HTML oder PDF

* Diff / Dokumente vergleichen, Absätzen oder sdt (content-Kontrollen)

* Unterstützung von Schriften (Schriftart-Ersetzung, und die Verwendung von Schriftarten in dem Dokument eingebettet)

Projekte mit docx4j

Docx4all ist die Swing-basierte Textverarbeitung.

Plutext Zusammenarbeit für Word 2007 verwendet docx4j auf dem Server, zu zerkleinern Word-Dokumente in kleinere Stücke, die unabhängig versioniert werden können.

Bitte kontaktieren Sie Plutext wenn Sie Ihr Projekt möchte an dieser Stelle aufgeführt werden.

Was Word-Dokumente werden unterstützt?

docx4j lesen / beschreiben kann docx-Dokumente oder für Word 2007 oder früheren Versionen, die das Compatibility Pack installiert haben, erstellt.

Die relevanten Teile der docx4j sind von der ECMA-Schemas generiert.

Es kann nicht lesen / schreiben Word 2003 XML-Dokumenten. Das Hauptproblem bei diesen ist, dass die XML-Namespace anders ist.

docx4j Word 2010 unterstützt werden docx-Dateien.

Mit docx4j Binärdateien

Sie können die neueste Version von docx4j von http://dev.plutext.org/docx4j/

Generell empfehlen wir Ihnen, gegen eine derzeit nightly build, entwickeln seit der letzten offiziellen Release kann oft mehrere Monate alt.

Die Unterstützung kann in den Gläsern. Tar.gz Version, oder in den entsprechenden Unterverzeichnis.

Mit docx4j durch Maven

Maven POM finden Sie unter: http://dev.plutext.org/trac/docx4j/browser/trunk/docx4j/m2/org/docx4j/docx4j

JDK-Versionen

Sie müssen mit Java 1.5+.

Dies ist wegen der JAXB 1 . Wenn Sie 1,4 muss, kann Retrotranslator angeblich machen es funktionieren.

Ein Wort über JAXB

docx4j verwendet, um JAXB Marshall und unmarshall die wichtigsten Teile in einem Dokument WordprocessingML, einschließlich der Hauptdokument Teil, die Stile Teil des Themas einerseits und der Eigenschaften Teile.

JAXB ist in Sun's Java inklusive 6-Distributionen, aber nicht 1.5. Wenn Sie also mit den 1,5 JDK, werden Sie JAXB 2.1.x auf Ihrem Classpath müssen.

Bits of docx4jWie org.docx4j.wml und org.docx4j.dml wurden mit Hilfe der JAXB xjc. Wir modifizierten die wml.xsd Schema in allem, so dass der Schlüssel resultierenden Klassen sind ein wenig freundlicher Mensch (dh nicht alle beginnen mit CT_ und St_).

Log4j

docx4j verwendet log4j für die Protokollierung. Protokollierung zu aktivieren, benötigen Sie einen log4.properties log4j.xml oder auf Ihrer Classpath. Siehe zum Beispiel http://dev.plutext.org/trac/docx4j/browser/trunk/docx4j/src/main/resources/log4j.xml

Javadoc

Javadoc zum Browsen oder online herunterladen, können in dem Verzeichnis gefunden werden http://dev.plutext.org/docx4j/

docx4j Source-Code

Um eine Kopie des aktuellen Quellcode:

svn co http://dev.plutext.org/svn/docx4j/trunk/docx4j docx4j

Alternativ können Sie auch online durchsuchen es um:

http://dev.plutext.org/trac/docx4j/browser/trunk/docx4j/

Gebäude docx4j von der Quelle

Command line - Kurzanleitung

"Quick", dass, vorausgesetzt Sie haben sich Maven und Ant installiert. Beachten Sie, dass wir nur verwenden, Maven, um die Abhängigkeiten greifen, nicht zu tun, die eigentliche bauen.

Erstellen Sie ein Verzeichnis namens Arbeitsbereich, CD-und in sie.

svn co http://dev.plutext.org/svn/docx4j/trunk/docx4j docx4j

Open pom.xml, suchen Sie die Zeile, die lautet

<systemPath>/usr/lib/jvm/java-6-sun/jre/lib/rt.jar</systemPath>

und bearbeiten Sie ihn auf Ihr System anpassen.

mvn install

ant dist

Das ant-Befehl erstellt die docx4j.jar und legen Sie sie und alle ihre Abhängigkeiten in der dist Richt.

Finsternis

Voraussetzungen

* Eclipse installiert

* Installieren Sie ein Eclipse-Plugin zB Subversion http://subclipse.tigris.org/update_1.2.x

* Installieren Maven and the Eclipse plugin

Und, wie oben diskutiert:

* Java 1.5 oder 6

* JAXB: sowohl die Umsetzung einbezogen JAXB in Java 6, und die 2.x Referenz-Implementierung. (Dies ist der Preis für die Unterstützung entweder während der Laufzeit)

Anleitung

* File > New "Project .." > SVN > Checkout Projects from SVN

* Erstellen Sie ein neues Repository location; Url ist http://dev.plutext.org/svn/docx4j

* Klicken Sie auf Ordner "trunk", Und wählen Sie docx4j; klicken Sie auf Weiter

* Sie wollen Projekts zu überprüfen, um es aus wie ein konfiguriertes mit dem New Project Wizard

* Wählen Sie dann Java> Java Project; klicken Sie auf Weiter

* Wählen Sie einen Projektnamen ein (zB "docx4j '), dann klicken Sie auf Weiter

* Klicken Sie auf Finish (wir definieren, die Java-Build-Einstellungen in einem späteren Schritt)

Nach ein paar andere Dialogfelder, sollten Sie das neue Projekt in Ihrem Arbeitsbereich.

Nun müssen wir die Konfiguration Classpath etc innerhalb von Eclipse, so dass sie zu bauen.

* Build Path> Configure Build Path> Java Build Path> Registerkarte Quelle

* Klicken Sie auf src, dann drücken Sie die Schaltfläche "Entfernen"

* Dann klicken Sie auf "Ordner hinzufügen" und navigieren Sie durch, um src / main / java und haken Sie 'Java'

* Fügen Sie dann src/svg, src/diffx and src/pptx4j/java ebenso

Die Maven-Bit:

* Vergewissern Sie sich, Maven und seine Plugin installiert - siehe oben Voraussetzungen.

* Führen Sie die Installation in mvn docx4j dir from a command prompt (just in case)

* Rechtsklick auf Projekt> Maven 2> Enable

Das Projekt sollte jetzt in Eclipse zu arbeiten, ohne Fehler2 .

Öffnen Sie eine vorhandene docx-Dokument

org.docx4j.openpackaging.packages. WordprocessingMLPackage stellt ein docx-Dokument.

So laden Sie ein Dokument, alles, was Sie tun müssen, ist:

WordprocessingMLPackage wordMLPackage =
WordprocessingMLPackage.load(new java.io.File(inputfilepath));

Diese Methode kann auch Last Flat OPC XML-Dateien.

Sie können dann das Hauptdokument Teil (Wort / document.xml):

MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();

Danach können Sie seinen Inhalt zu manipulieren.

WordML Konzepte

Um etwas viel über diese, müssen Sie ein Verständnis der grundlegenden Konzepte WordML haben.

Laut dem Microsoft Open Packaging spec ist jeder docx-Dokument aus einer Reihe von Teil-Dateien gemacht, zip-gepackt. Ein Teil ist in der Regel XML, aber vielleicht nicht (Teil eines Bildes, zum Beispiel, ist das nicht).

Eine Einführung in WordML geht über den Rahmen dieses Dokuments. Hier finden Sie eine gut lesbare Einführung in 1st Edition Teil 3 (Primer) an http://www.ecma-international.org/publications/standards/Ecma-376.htm oder http://www.ecma-international.org/news/TC45_current_work/TC45_available_docs.htm (Eine bessere Verbindung, da ihr keine zip-gepackt).

JAXB: Rangier-und Unmarshalling

docx4j enthält eine Klasse repräsentiert jedes Teil. Zum Beispiel gibt es eine MainDocumentPart Klasse. XML Teilen erben von JaxbXmlPart , genannt enthält ein Mitglied jaxbElement. Wenn Sie wollen einen Teil zur Arbeit mit dem Inhalt, Sie arbeiten mit ihren jaxbElement.

Wenn Sie ein docx-Dokument mit docx4j, docx4j automatisch unmarshals die Inhalte der einzelnen XML-Teil zu einem stark vom Typ Java-Objekt-Baum (der jaxbElement).

Gleiches gilt, wenn / wenn Sie sagen, docx4j Diese Java-Objekte als docx speichern, docx4j automatisch Marschälle der jaxbElement In jedem Teil.

Manchmal wirst du den Marschall oder unmarshal Dinge selbst wollen. Die Klasse org.docx4j.jaxb.Context definiert alle JAXBContexts verwendet in docx4j:

Jc

org.docx4j.wml
org.docx4j.dml

org.docx4j.dml.picture

org.docx4j.dml.wordprocessingDrawing

org.docx4j.vml
org.docx4j.vml.officedrawing

org.docx4j.math

jcThemePart

org.docx4j.dml

jcDocPropsCore

org.docx4j.docProps.core

org.docx4j.docProps.core.dc.elements

org.docx4j.docProps.core.dc.terms

jcDocPropsCustom

org.docx4j.docProps.custom

jcDocPropsExtended

org.docx4j.docProps.extended

jcXmlPackage

org.docx4j.xmlPackage

jcRelationships

org.docx4j.relationships

jcCustomXmlProperties

org.docx4j.customXmlProperties

jcContentTypes

org.docx4j.openpackaging.contenttype

jcPML

org.docx4j.pml
org.docx4j.dml

org.docx4j.dml.picture

Architektur

docx4j hat 3 Schichten:

1. org.docx4j.openpackaging

OpenPackaging Griffe Dinge an der Open Packaging Conventions Ebene: Entpacken in ein docx WordprocessingMLPackage und eine Reihe von Objekten Vererbung von Teil; damit Teile gelöscht werden hinzugefügt /; Speichern der docx

Diese Schicht ist ursprünglich auf der Grundlage OpenXML4J (was auch von Apache POI) eingesetzt.

Teile sind in der Regel Unterklassen org.docx4j.openpackaging.parts.JaxbXmlPart

Teile werden in einer Baumstruktur angeordnet. Wenn ein Teil Nachkommen hat, wird es eine org.docx4j.openpackaging.parts.relationships.RelationshipsPart denen diese Nachkomme Teile identifiziert. Die Probe PartsList (siehe nächster Abschnitt) zeigt Ihnen, wie das funktioniert.

Ein JaxbXmlPart Baum hat einen Inhalt:

public Object getJaxbElement() {
return jaxbElement;
}

public void setJaxbElement(Object jaxbElement) {
this.jaxbElement = jaxbElement;
}

2. Die JAXB Inhalte Baum ist die zweite Ebene der drei Schichten-Modell.

Die meisten Teile davon (einschließlich MainDocumentPart, Stile, Kopf-und Fußzeilen, Anmerkungen, Endnoten / Fußnoten) verwenden org.docx4j.wml (WordprocessingML); wml Artikeln org.docx4j.dml (DrawingML) wie nötig.

Diese Klassen wurden aus der Open XML-Schemas erzeugt

3. org.docx4j.model

Dieses Paket baut auf den beiden unteren Schichten, um zusätzliche Funktionalität bereitzustellen, und wird schrittweise weiter ausgebaut.

Proben

Das Paket enthält org.docx4j.samples Beispiele dafür, wie Dinge zu tun, um mit docx4j. Dazu gehören:

Basics

* CreateWordprocessingMLDocument

* DisplayMainDocumentPartXml

* OpenAndSaveRoundTripTest

* OpenMainDocumentAndTraverse

Ausgang / Transformation

* CreateHtml

* CreatePdf

Flat OPC XML

* ExportInPackageFormat

* ImportFromPackageFormat

Image Handling

* AddImage

* ConvertEmbeddedImageToLinked

Teilehandling

* CopyPart

* ImportForeignPart

* PartsList

* StripParts

Verschiedenes

* CompareDocuments

* CreateDocxWithCustomXml

* CustomXmlBinding

* DocProps

* Filter

* HyperlinkTest

* NumberingRestart

* UnmarshallFromTemplate

Wenn Sie den Quellcode installiert, werden Sie dieses Paket bereits haben.

Wenn Sie nicht haben, können Sie sie online durchsuchen, um

http://dev.plutext.org/trac/docx4j/browser/trunk/docx4j/src/main/java/org/docx4j/samples

Es gibt auch verschiedene Beispiel-Dokumente in der / sample-docs-Verzeichnis, das sind die meisten leicht zugänglich, indem Sie docx4j svn.

Teileliste

Um ein besseres Verständnis davon, wie docx4j Werke und die Struktur einer docx-Dokument können Sie das PartsList Probe auf einem docx (oder ein pptx). Wenn Sie dies tun, wird es eine Liste der Hierarchie der Teile in diesem Paket benutzt werden. Es wird Ihnen sagen, welche Klasse verwendet wird, um jedes Teil darstellen, und wo dieser Teil ist ein JaxbXmlPart, es wird Ihnen auch sagen, welche Klasse die jaxbElement ist.

Zum Beispiel:

Part /_rels/.rels [org.docx4j.openpackaging.parts.relationships.RelationshipsPart]
containing JaxbElement:org.docx4j.relationships.Relationships

Part /docProps/app.xml [org.docx4j.openpackaging.parts.DocPropsExtendedPart]
containing JaxbElement:org.docx4j.docProps.extended.Properties

Part /docProps/core.xml [org.docx4j.openpackaging.parts.DocPropsCorePart]
containing JaxbElement:org.docx4j.docProps.core.CoreProperties

Part /word/document.xml [org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart]
containing JaxbElement:org.docx4j.wml.Document

Part /word/settings.xml [ org.docx4j.openpackaging.parts.WordprocessingML .DocumentSettingsPart]
containing JaxbElement:org.docx4j.wml.CTSettings

Part /word/styles.xml [ org.docx4j.openpackaging.parts.WordprocessingML .StyleDefinitionsPart]
containing JaxbElement:org.docx4j.wml.Styles

Part /word/media/image1.jpeg [ org.docx4j.openpackaging.parts.WordprocessingML .ImageJpegPart]

Durchlaufen einer docx

OpenMainDocumentAndTraverse.java in den Proben-Verzeichnis zeigt Ihnen, wie Sie die Darstellung eines JAXB docx zu durchqueren.

Eine ärgerliche Sache über JAXB, ist, dass ein Objekt eine Tabelle dargestellt sagen könnte wie org.docx4j.wml.Tbl (Wie Sie es erwarten würden). Oder es könnte in einem gewickelt werden javax.xml.bind.JAXBElement, In welchem Fall der realen Tisch zu bekommen, müssen Sie etwas tun:

if ( ((JAXBElement)o).getDeclaredType().getName().equals( "org.docx4j.wml.Tbl" ) )

org.docx4j.wml.Tbl tbl = (org.docx4j.wml.Tbl) ((JAXBElement) o). getValue ();

Erstellen einer neuen docx

So erstellen Sie eine neue docx:

/ / Erstellen Sie das Paket

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();

/ / Speichern

wordMLPackage.save(new java.io.File("helloworld.docx") );

Das war's.

createPackage() ist eine bequeme Methode, die funktioniert:

/ / Erstellen Sie das Paket

WordprocessingMLPackage wordMLPackage = new WordprocessingMLPackage();

/ / Erstellen Sie das Hauptdokument Teil (Wort / document.xml)

MainDocumentPart wordDocumentPart = new MainDocumentPart();

/ / Create Hauptdokument Teil Inhalt

ObjectFactory factory = Context.getWmlObjectFactory();

org.docx4j.wml.Body body = factory .createBody();

org.docx4j.wml.Document wmlDocumentEl = factory .createDocument();

wmlDocumentEl.setBody(body);

/ / Stellen Sie den Inhalt in dem Teil

wordDocumentPart.setJaxbElement(wmlDocumentEl);

/ / Schreibe das Hauptdokument Teil des Pakets Beziehungen

/ / (Schaffung wenn nötig)

wmlPack.addTargetPart(wordDocumentPart);

Hinzufügen eines Textabsatz

MainDocumentPart enthält eine Methode:

public org.docx4j.wml.P addStyledParagraphOfText(String styleId, String text)

Sie können mit dieser Methode zu einem Absatz mit Hilfe der angegebenen Stil hinzuzufügen.

Die XML suchen wir schaffen so etwas wie:

< w:p xmlns:w ="http://schemas.openxmlformats.org/wordprocessingml/2006/main" >
< w:r >
< w:t > Hello world </ w:t >
</ w:r >
</ w:p >

addStyledParagraphOfText baut die Objekt-Struktur der JAXB Weg, und fügt es zu dem Dokument.

ObjectFactory factory = Context.getWmlObjectFactory();

/ / Erstellen des Absatzes

org.docx4j.wml.P para = factory.createP();

/ / Erstellen Sie das Textelement

org.docx4j.wml.Text t = factory.createText();

t.setValue(simpleText);

/ / Erstellen der Flucht

org.docx4j.wml.R run = factory.createR();

run.getRunContent().add(t);

para.getParagraphContent().add(run);

/ / Jetzt fügen wir Absatz, um das Dokument Körper

Body body = this.jaxbElement.getBody();

Body.getEGBlockLevelElts().add(para)

Alternativ können Sie auch den Absatz von Rangier-XML zu erstellen:

/ / Angenommen String xml enthält die XML oben

org.docx4j.wml.P para = XmlUtils.unmarshalString(xml);

Damit dies funktioniert, müssen Sie sicherstellen, dass alle Namespaces ordnungsgemäß in der Zeichenfolge deklariert.

Hinzufügen eines Teils

Was passiert, wenn Sie eine neue Stile Teil hinzufügen wollte? So geht's:

/ / Create a Stile Teil

StyleDefinitionsPart stylesPart = new StyleDefinitionsPart();

/ / Füllt ihn mit Standardstile

stylesPart.unmarshalDefaultStyles();

/ / Die Stile teilweise auf das Hauptdokument Teil Add-Beziehungen

wordDocumentPart.addTargetPart(stylesPart);

Nimmst du den gleichen Ansatz zu einem Kopf-oder Fußzeile hinzuzufügen.

Wenn Sie einen Teil fügen diese Weise wird es automatisch an der Quelle ein Teil der Beziehungen Teil hinzugefügt.

In der Regel müssen Sie auch einen Verweis auf das Teil (mit seiner Beziehung id) zugegeben, um das Hauptdokument Teil. Dies gilt für Bilder, Kopf-und Fußzeilen. (Kommentare, Fußnoten und Endnoten ein bisschen anders, in das, was Sie zu dem Hauptdokument Teil hinzufügen, sind Bezugnahmen auf einzelne Anmerkungen / Fußnoten / Endnoten).

docx zu (X) HTML

docx4j XSLT nutzt eine docx zu XHTML zu transformieren:

AbstractHtmlExporter exporter = new HtmlExporterNG2();

/ / Beachten Sie das * 2 * es

/ / Schreiben an StreamResult (in diesem Fall einen Output-Stream)

OutputStream os = new java.io.FileOutputStream(inputfilepath + ".html" );

javax.xml.transform.stream.StreamResult result
= new javax.xml.transform.stream.StreamResult(os);

exporter.html(wordMLPackage, result,

inputfilepath + "_files" );

Sie werden die generierten HTML zu finden ist sauber.

docx4j XSLT-Erweiterung nutzt Java-Funktionen, die schweres Heben zu tun, so dass der XSLT selbst ist einfach gehalten.

docx zu PDF

docx4j XSL FO produziert, was wiederum kann ein PDF zu erstellen.

Zurzeit ist integriert in Apache FOP docx4j für die Erstellung der PDF. (Bald werden wir Dinge zu verändern, so dass docx4j generiert für die Nutzung durch Ihre bevorzugte FOR-Renderer, ob das FOP oder ein kommerzielles Tool wie XEP's).

Zum Erstellen einer PDF:

/ / Fonts identische Abbildung am besten auf Microsoft Windows

wordMLPackage.setFontMapper( new IdentityPlusMapper());

/ / Set Up-Konverter

org.docx4j.convert.out.pdf.PdfConversion c
= new org.docx4j.convert.out.pdf.viaXSLFO.Conversion(wordMLPackage);

/ / Schreiben an Output-Stream

OutputStream os = new java.io.FileOutputStream(inputfilepath + ".pdf" );

c.output(os);

Image Handling

Wenn Sie ein Bild hinzufügen, um ein Dokument in Word 2007 ist es im Allgemeinen als ein neuer Teil hinzugefügt (dh Sie werden einen Teil in der resultierenden docx zu finden, die das Bild enthält in Base-64-Format).

Beim Öffnen des Dokuments in docx4j, docx4j will create an image part representing it.

Es ist auch möglich, eine verknüpfte Bild zu erstellen. In diesem Fall wird das Bild nicht in den docx-Paket eingebettet, sondern wird auf seiner externen Quelle verwiesen.

docx4j'S BinaryPartAbstractImage Klasse enthält Methoden, um Ihnen zu erlauben erstellen sowohl eingebettete und verknüpfte Bilder (zusammen mit entsprechenden Beziehungen).

/ **

* Erstellen Sie ein Bild aus dem Rahmen vorgesehen Byte-Array, hängen Sie es an die

* Hauptdokument Teil, und senden Sie es .* /

public static BinaryPartAbstractImage createImagePart(WordprocessingMLPackage wordMLPackage,

byte [] bytes)

/ **

* Erstellen Sie ein Bild aus dem Rahmen vorgesehen Byte-Array, hängen Sie es an die Quelle Teil

* (Z. B. das Hauptdokument Teil, ein Kopfteil etc), und senden Sie es .* /

public static BinaryPartAbstractImage createImagePart(WordprocessingMLPackage wordMLPackage,

Part sourcePart, byte [] bytes)

/ **

* Erstellen Sie ein verknüpftes Bild Teil, und fügen Sie es als eine rel von der angegebenen Quelle Teil

* (ZB eine Header-Teil) * /

public static BinaryPartAbstractImage createLinkedImagePart(
WordprocessingMLPackage wordMLPackage, Part sourcePart, String fileurl)

Für ein Bild im Dokument erscheinen, braucht es eben auch entsprechende XML in das Hauptdokument Teil werden. Diese XML können 2 Grundformen:

* die Word 2007 w: Zeichnung Form

<w:p>

<w:r>

<w:drawing>

<wp:inline distT ="0" distB ="0" distL ="0" distR ="0" >

<wp:extent cx ="3238500" cy ="2362200" / >

<wp:effectExtent l ="19050" t ="0" r ="0" b ="0" / >

:

<a:graphic >

<a:graphicData .. >

<pic:pic >

:

<pic:blipFill>

< a:blip r:embed ="rId5" / >

:

< / pic:blipFill>

:

< / pic:pic>

< / a:graphicData>

< / a:graphic>

< / wp:inline>

< / w:drawing>

< / w:r>

< / w:p>

* Word 2003 VML-basierte w: pict Form

<w:p>

<w:r>

<w:pict>

<v:shapetype id ="_x0000_t75" coordsize ="21600,21600" .. >

<v:stroke joinstyle ="miter" / >

<v:formulas>

:

< / v:formulas>

:

< / v:shapetype>

<v:shape .. style ="width:428.25pt;height:321pt" >

< v:imagedata r:id ="rId4" o:title ="" / >

< / v:shape>

< / w:pict>

< / w:r>

< / w:p>

docx4j können die Word 2007 w: Zeichnung / wp: Inline- Formular für Sie:

/ **

* Create a <wp:inline> element suitable for this image,

* Welche direkten oder eingebettet werden kann in w: p / w: r / w: Zeichnung.

* If the image is wider than the page, it will be scaled

* Automatisch. Siehe Javadoc für andere Signaturen.

* @ param filenameHint Jeder Text, zum Beispiel den ursprünglichen Dateinamen

* @ param altText wie HTML's Alt-Text

* @ param id id1 Ein einzigartiges Dokument in der

* @ param id ID2 weiteres einzigartiges Dokument in der

* @ param link true, wenn dies zu gelinkten keine eingebetteten * /

public Inline createImageInline(String filenameHint, String altText,

int id1, int id2, boolean link)

was kann man dann ein Produkt zum W: R / W: Zeichnung.

Schließlich, mit docx4jSie können Bilder von Formaten wird nicht von Word (zB PDF), um PNG, die ein unterstütztes Format konvertieren. Für diese, docx4j verwendet ImageMagick. Also, wenn Sie wollen, dass diese Funktion zu nutzen, müssen Sie ImageMagick installieren. docx4j ruft mit ImageMagick:

Process p = Runtime.getRuntime().exec( "imconvert -density " + density + " -units PixelsPerInch - png:-" );

Notieren Sie den Namen imconvert , die verwendet wird, so dass wir nicht haben, um exec liefern einen vollständigen Pfad zu. Sie müssen, dass unterbringen.

Text-Extraktion

Eine schnelle Möglichkeit, docx extrahieren den Text aus einem, ist die Verwendung textutils

public static void extractText(Object o, Writer w)

das Objekt ist über einen SAX ContentHandler übergeben wird, Streckenposten, um die Ausgabe des Textes des Schriftstellers.

Text Substitution

Text Substitution ist leicht genug, vorausgesetzt, die Zeichenkette Sie ein in suchen vertreten ist org.docx4j.wml.Text Objekt in dem Formular, das Sie erwarten.

Allerdings wird das nicht unbedingt der Fall sein. Der String könnte gebrochen werden über Text läuft für jede der folgenden Gründe:

* Teil des Wortes ist fett formatiert anders (zB in)

* Rechtschreibung / Grammatik

* Editieren Ordnung (RSID)

docx4j wird schließlich beherbergen diese Fälle, aber nicht jetzt.

Unter diesem können Sie Text-Substitution in einer Vielzahl von Möglichkeiten zu tun, zum Beispiel:

* durchqueren das Hauptdokument Teil und Blick auf die org.docx4j.wml.Text Objekte

* Marschall auf einen String, suchen / ersetzen, die in, dann wieder unmarshall

docx4j s XmlUtils enthält außerdem:

/ **

* Geben Sie eine Zeichenfolge mit wml $ () key1, return $ () key2, einen geeigneten

* Objekt .* /

public static Object unmarshallFromTemplate(String wmlTemplateString,

java.util.HashMap <string, string> Mappings)

Siehe UnmarshallFromTemplate Beispiel, die auf eine Zeichenfolge mit betreibt:

<w:p>

<w:r>

<w:t> My favourite colour is ${colour} . < / w:t>

< / w:r>

< / w:p>

<w:p / >

<w:p>

<w:r>

<w:t> My favourite ice cream is ${icecream} . < / w:t>

< / w:r>

< / w:p>

Tipps und Tricks

Die Arbeit mit dem Flat OPC XML-Format

Wenn Sie innerhalb einer docx-Dokument suchen, ist es ein bisschen wie ein Schmerz zu müssen, entpacken Sie es auf den betreffenden Teil zu suchen.

Es gibt 2 Möglichkeiten, um dieses.

Eines ist http://www.codeplex.com/PackageExplorer , Welche die docx entpacken kann, und ein Teil pretty print.

Ein weiterer Grund ist die docx als Word-XML-Dokument (*. xml) speichern. Dies erzeugt eine einzige XML-Datei, die Sie in einem XML-Editor wie XPontus öffnen können.

docx4j Flat kann OPC XML-Dateien öffnen und speichern sie.

So öffnen Sie eine Flat OPC XML-Datei:

WordprocessingMLPackage wordMLPackage =
WordprocessingMLPackage.load(new java.io.File(inputfilepath));

Zum Speichern als Flat OPC XML:

wordMLPackage.save(new java.io.File(outputfilepath));

In beiden Fällen wird die Flat OPC-Code verwendet werden, wenn und nur wenn die Dateierweiterung. Xml werden.

Denken Sie daran, UnmarshalFromString

Wenn Sie manipulieren docx-Dokumenten ist es oft nützlich, unmarshal Schnipsel von XML (zB ein String, der einen Absatz in das Dokument eingefügt werden).

Zum Beispiel gegeben:

< w:p xmlns:w ="http://schemas.openxmlformats.org/wordprocessingml/2006/main" >
< w:r >
< w:t > Hello world </ w:t >
</ w:r >
</ w:p >

Sie können einfach:

/ / Angenommen String xml enthält die XML oben

org.docx4j.wml.P para = XmlUtils.unmarshalString(xml);

Cloning

So klonen Sie eine JAXB-Objekt verwenden Sie eine der folgenden Methoden in XmlUtils:

/ ** Klon diesem JAXB-Objekt mit Standardwerten JAXBContext. * /

public static <T> T deepCopy(T value)

/ ** Klon diesem JAXB-Objekt * /

public static <T> T deepCopy(T value, JAXBContext jc)

@XmlRootElement

Die am häufigsten verwendeten Objekte haben eine @ XmlRootElement Annotation, so können sie Deserialisie-rung werden mobilisiert und.

In einigen Fällen können Sie diese Anmerkung fehlt finden.

Wenn Sie sich nicht fügen Sie die Kommentierung der JAXB Quellcode, eine Alternative ist es, Marshall es mit Code, der QName ist explizit über die daraus. Zum Beispiel enthält XmlUtils:

/ ** Marshal zu einer W3C-Dokument, für das Objekt

* Fehlt eine Annotation @ XmlRootElement. * /

public static org.w3c.dom.Document marshaltoW3CDomDocument(Object o, JAXBContext jc,
String uri, String local, Class declaredType)

Sie könnten dies etwa so:

CTFootnotes footnotes =
wmlPackage.getMainDocumentPart().getFootnotesPart().getJaxbElement().getValue();

CTFtnEdn ftn = footnotes.getFootnote().get(1);

/ / Keine @ XmlRootElement auf CTFtnEdn, so ..

Document d = XmlUtils.marshaltoW3CDomDocument( ftn,

Context.jc, Namespaces.NS_WORD12, "footnote" , CTFtnEdn. class );

Wenn Sie unmarshal benötigen, können Sie verwenden:

public static Object unmarshalString(String str, JAXBContext jc, Class declaredType)

Der docx4j Forum

Kostenlose Community-Unterstützung ist in den verfügbaren docx4j Forum, um http://dev.plutext.org/forums/

Diese Diskussion ist in der Regel in englischer Sprache. Wenn Sie freiwillig an einem Forum in Ihrer Sprache moderate, lass es uns wissen.

Weitere Support-Optionen

Wenn die kostenlose Community-Support in den docx4j forum nicht Ihren Bedürfnissen entsprechen, oder Sie wollen einfach auslagern einige Codierung, Sie willkommen zu erwerben Programmierung, Beratung und Unterstützung von vorrangigen sind http://www.plutext.com/m/index.php/docx4j-support.html

Durch den Kauf von Dienstleistungen aus Plutext, unterstützen Sie die Weiterentwicklung der docx4j.

Roadmap

Word 2010 unterstützt. Support für das neue XML-Elemente / Schemata mit Word 2010 eingeführt, und für die Vereinbarkeit Mechanismus. Dies ist die wichtigste Rechtfertigung für den 3,0-Label.

HTML Ausführer: bekommen diejenigen loswerden alt; standardisieren NG2. Die Idee ist, entfernen Sie alle ", das sollte ich verwenden" Verwirrung und konzentrieren Aufwand / Know-how.

PDF Ausführer: Standardisierung auf viaXSLFO und loszuwerden viaIText und viaHTML. Wie bei HTML, liegt die Idee zu entfernen ", das sollte ich verwenden" Verwirrung und konzentrieren Aufwand / Know-how. docx4j Für nur konnte XSL, und auf den Anwender darauf verlassen, dass FOP oder gleichwertig sind tatsächlich die PDF zu erzeugen. Dadurch verringert Abhängigkeiten, so dass docx4j leichter. Das Ziel wäre, die FOP-jar (2.8M) entfernen, PDF Renderer jar (1.6m), iText jar (1,1), und Core-Renderer (1M).

Font-Handling: Entfernen Sie die Bestellung panose, so brauchen wir nicht eine individuelle FOP jar.

Layout-Modell / Intermediate Format: docx4j enthält eine DocumentModel, die weiter entwickelt werden könnte, um Unterstützung:

* Suchen / Ersetzen

* Schätzung Seiteninhalt

* XSLT, durch Einschließen Abschnitte, Listen

Einfügen von OLE-Objekten: so Tabellen, PDFs usw. eingebettet werden kann.

Impressum

Dieses Dokument wurde in Word 2007 geschrieben und verwendet:

* XML hübsch gedruckt http://www.softlion.com/webTools/XmlPrettyPrint/default.aspx oder "Package Explorer

* Java-Quellcode formatiert http://www.java2html.de

Die PDF-und HTML-Versionen wurden mit Hilfe docx4j (PDF über XSL-FO und FOP).

Kontakt Plutext

Sofern Sie für eine Unterstützung gezahlt haben, allgemein Wie kann ich Typs Fragen direkt an die veröffentlicht werden sollten docx4j forum . Plutext kann dem Forum posten Fragen sie erhält per E-Mail, die an das Forum hätte richten müssen.

Plutext kann entweder kontaktiert werden jason@plutext.org Oder jharrop@plutext.com

1 http://forums.java.net/jive/thread.jspa?threadID=411

2 Wenn Sie die Fehlermeldung "Access Einschränkung: Der Typ ist nicht zugänglich, da Beschränkung erforderlich rt.jar Bibliothek "(vielleicht mit Hilfe einer Kombination aus Eclipse 3.4 und / oder JDK 6 Update 10?), müssen Sie die Build gehen in die Pfad für das Projekt, Bibliotheken Registerkarte wählen Sie die JRE System Library, und fügen Sie eine Zugriffsregel, "Accessible, **".