2024年5月27日发(作者:)
docx4j 入门
这份文件的最新版本总是可以找到 docx4j svn in /docs (在 Flat OPC XML 格
式为Word 2007, HTML ,和 PDF )。
这份文件是从英文翻译使用谷歌翻译。 如果你能提高翻译,请随时发送给你的
改进版。 对于最近的报告,总是指英文版本。
什么是 docx4j?
docx4j 是一个解压的docx一个“一揽子”库,并解析WordprocessingML XML
创建一个内存中的代表性 Java 。 最新版本的 docx4j 也支援PowerPoint pptx
文件。
它是在概念上类似于微软的OpenXML SDK,它是对的。NET。
docx4j 是开源的,可以按照Apache许可证(2版)。 作为一个开放源码项目,
欢迎踊跃投稿。 请参阅 docx4j 论坛 /forums/ 了解
详情。
docx4j 严重依赖 JAXB,XML绑定的Java JCP标准。 你能想到的 docx4j 作为
一个JAXB的实施除其他():
打开包装公约
WordprocessingML(docx)的,开放的XML部分
Presentation ML (pptx) part of OpenXML
该库是为了圆100%保真度之行docx文件,支持所有2007 WordML中。 为新的
Word 2010功能的支持我们会尽快添加。
该 docx4j 项目是由 Plutext ( )。
是 docx4j 为你?
docx4j 负责处理的docx文件(和pptx介绍)在爪哇。
这不是旧的二进制(。doc)格式文件。 针对这一情况,看看在Apache的POI
的HWPF。 (事实上, docx4j 使用基本转换HWPF。文件,以。docx)的
它也不是为RTF文件。
如果你要处理的。NET平台的docx文件,你应该看看微软的OpenXML SDK的代
替。
一种替代方法 docx4j 是Apache的POI。 我特别建议,对于处理Excel文件。
它也可以用来处理Word文档,而且由于它使用XMLBeans的(不使用JAXB)它
可能是一个更好的选择,如果你想使用XMLBeans。
什么样的事情可以做各种各样 docx4j?
打开现有的docx文件系统(从SMB / CIFS通讯,使用WebDAV的VFS的)
创建新的docx
编程操作(当然docx文档)
Template substitution; CustomXML binding
导入二进制文档(使用Apache的POI HWPF)
生产/消费的Word 2007的xmlPackage(封装)格式
保存的docx,以文件系统作为一个的docx(即压缩),或的JCR(解压)
申请转换,包括常用的过滤器
导出为HTML或PDF
漫射/比较文件,段落或特殊和差别待遇(内容控制)
支持字体(字体替换,文件中使用嵌入任何字体)
项目使用 docx4j
Docx4all是基于Swing的文字处理器。
Plutext Word 2007的协作使用 docx4j 在服务器上,以切碎成更小的字,可独
立版本件文件。
请联系Plutext如果您希望您的项目在这里列出。
什么它支持Word文档?
docx4j 可以读/写或Word 2007中,或已安装该兼容包的早期版本创建的docx
文件。
相关零件 docx4j 从ECMA的生成模式。
它不能读/写的Word 2003 XML文档。 与这些主要问题是,XML命名空间是不同
的。
docx4j 支持的Word 2010的docx文件。
运用 docx4j 二进制文件
你可以下载最新版本 docx4j 从 /docx4j/
一般来说,我们建议您开发的最新正式发布以来针对目前每晚构建,往往是几个
个月大。
支持jar文件中可以找到的。的版本,或者在有关的子目录。
运用 docx4j 通过 Maven
Maven POM 可在
/trac/docx4j/browser/trunk/docx4j/m2/org/docx4j
/docx4j
JDK版本
你需要使用 Java 1.5+。
这是因为JAXB的
1
。 如果您必须使用1.4,retrotranslator可以 使据说 它
的工作。
关于JAXB的字
docx4j 使用JAXB的马歇尔和unmarshall在WordprocessingML文档中的关键部
件,包括主要文件的一部分,风格的一部分,主题的一部分,性能部分。
JAXB是包含在Sun的Java 6中的分布,而不是1.5。 因此,如果您使用的是
1.5的JDK,你将需要在您的类路径的JAXB 2.1.x。
位的 docx4j如 和 产生了使用JAXB的XJC。
我们修改了,特别是模式,使产生的关键类是多一点人友好的(即不是
所有的CT_和ST_开始)。
Log4j的
docx4j 使用log4j的日志记录。 要启用日志记录,您需要在您的类路径
ties或。 例如见
/trac/docx4j/browser/trunk/docx4j/src/main/reso
urces/
Javadoc
网上浏览或下载Javadoc中,可以发现在目录
/docx4j/
docx4j 源代码
要获取该电流源代码的副本:
svn co
/svn/docx4j/trunk/docx4j
docx4j
或者,你可以浏览它的在线,网址为:
/trac/docx4j/browser/trunk/docx4j/
建筑 docx4j 从源
命令行 - 快捷操作
“快”,即只要你有Maven和Ant安装。 请注意,我们只是使用Maven来获取
依赖,不求实际的建设。
创建一个目录称为工作区,和CD进去。
svn co
/svn/docx4j/trunk/docx4j
docx4j
开放的,找到一行字:
并编辑它来适应你的系统。
mvn install
ant dist
这ant命令将创建并把它和所有在dist目录的依赖关系。
日食
先决条件
Eclipse的安装
安装一个Eclipse插件,例如颠覆
/update_1.2.x
安装 Maven and the Eclipse plugin
而且,正如上面讨论:
Java 1.5或6
JAXB的: 既 包括执行的JAXB的Java 6中, 并 在2.x的参考实现。 (这
是运行时的价格支持功能)
说明
File > New "Project .." > SVN > Checkout Projects from SVN
创建一个新的存储库的位置;网址是 /svn/docx4j
点击文件夹 "trunk",并选择docx4j;点击下一步
您要检查它作为一个项目配置使用新建项目向导
然后选择Java> Java项目,请点击下一页
选择一个项目名称(例如,'docx4j'),然后单击下一步
点击完成(我们将定义的Java构建步骤设置在后面)
经过其他对话框的情侣,你应该在你的工作区的新项目。
现在,我们需要配置 类路径 的Eclipse等内,以便它可以建立。
生成路径>“配置构建路径> Java构建路径>源标签
点击钢骨混凝土,然后按删除按钮
然后点击“添加文件夹”,并浏览到src /主/ Java和剔的Java'
然后添加 src/svg, src/diffx and src/pptx4j/java 以及
在Maven位:
请确保您有安装Maven和它的插件-见上面的先决条件。
安装在运行mvn docx4j 你从命令提示符(以防万一)
合适的项目点击>的Maven 2>“启用
该项目现在应该在Eclipse工作没有错误
2
。
打开一个现有的docx文件
es. WordprocessingMLPackage 代表
一个docx文档。
要加载的文件,所有您需要做的是:
WordprocessingMLPackage wordMLPackage =
(new (inputfilepath));
这种方法还可以加载平板的OPC XML文件。
然后,您可以得到的主要文件的一部分(字/ ):
MainDocumentPart documentPart = nDocumentPart();
在此之后,您可以操作的内容。
WordML中的概念
要做到这远远超出任何事情,你需要有一个基本的WordML中概念的理解。
根据微软开放包装规格,每个的docx文件是由一个部分文件的数量,压缩了。 通
常是XML的一个部分,但未必是(1图像的一部分,例如,是不是)。
一个WordML中介绍了文件的范围超出了这一点。 你可以找到一个非常可读引入
1
日
第3版(底漆)在
/publications/standards/
或
/news/TC45_current_work/TC45_availab
le_ (一更好的联系,因为它不是压缩了)。
JAXB的:编组和解组
docx4j 包含一个类代表每个部分。 例如,有一个 MainDocumentPart 类。 XML
的部分继承 JaxbXmlPart ,其中包含一个成员叫 jaxbElement。 当你要处理
的一个部分的内容,你的工作与jaxbElement。
当你打开一个docx文档使用 docx4j, docx4j 自动
反编排
的XML部分的内容
每到一个强类型的Java对象树( jaxbElement)。
同样,如果/当你告诉 docx4j 保存为这些Java对象的docx, docx4j 自动
纠
察
的 jaxbElement 在每一部分。
有时候你会希望自己的东西编组或解组。 类
t
定义了所有
的用于JAXBContexts docx4j:
Jc
e
ocessingDrawing
drawing
jcThemePart
jcDocPropsCore
ts
jcDocPropsCustom
jcXmlPackage
jcRelationships
jcContentTypes
jcPML
kage
onships
ttype
e
jcDocPropsExtended
ed
jcCustomXmlProperties
XmlProperties
建筑
docx4j 有3个层次:
1。 ckaging
OpenPackaging处理层次的东西在开放式打包约定:解压缩1到的docx
WordprocessingMLPackage 和一个第二部分设置继承的对象,允许部分被添
加/删除;保存的docx
这一层本来是基于OpenXML4J(也是由Apache POI的使用)。
一般子类零件 lPart
零件都被排列在一棵树上。 如果部分后裔,将有
onshipsPart
其中确定的后裔部分。 该示例PartsList(见下一节)告诉您如何工作的。
阿JaxbXmlPart有一个内容树:
public Object getJaxbElement() {
return jaxbElement;
}
public void setJaxbElement(Object jaxbElement) {
ement = jaxbElement;
}
2。 在 JAXB的 内容树 是分层模型的第二个级别3。
大部分地区(包括MainDocumentPart,样式,页眉/页脚,注释, 尾注 /脚注)
的使用 (WordprocessingML); WML的 提述
图形处理(DrawingML)作为必要的。
这些类都从打开XML模式
3。
这个软件包的基础上降低2层,提供额外的功能,并正在逐步进一步发展。
样品
该封装s包含例子如何做事与 docx4j。 这些措施包括:
基础知识
CreateWordprocessingMLDocument
DisplayMainDocumentPartXml
OpenAndSaveRoundTripTest
OpenMainDocumentAndTraverse
输出/转型
CreateHtml
CreatePdf
扁平的OPC XML的
ExportInPackageFormat
ImportFromPackageFormat
图像处理
AddImage
ConvertEmbeddedImageToLinked
第一部分处理
CopyPart
ImportForeignPart
PartsList
StripParts
杂项
CompareDocuments
CreateDocxWithCustomXml
CustomXmlBinding
DocProps
Filter
HyperlinkTest
NumberingRestart
UnmarshallFromTemplate
如果您安装了源代码,你就会有这个包了。
如果你没有,你可以浏览它的在线,在
/trac/docx4j/browser/trunk/docx4j/src/main/java/org/docx4j/sa
mples
此外,还有各种 样本文件 在/采样docs目录,这些是最容易通过检查进行访问
docx4j 使用svn。
零件清单
为了更好地了解如何 docx4j 工程和一个docx文档的结构你可以运行
PartsList 样本上的docx(或pptx)。 如果这样做,它会列出包层次结构,在
部分地区采用。 它会告诉你哪个类是用来表示每个部分,如该部分是一个
JaxbXmlPart,它还会告诉你什么阶层的
jaxbElement
的。
例如:
Part /_rels/.rels [onshipsPart]
containing JaxbElement:onships
Part /docProps/ [psExtendedPart]
containing JaxbElement:ties
Part /docProps/ [psCorePart]
containing JaxbElement:operties
Part /word/
[cumentPart]
containing JaxbElement:nt
Part /word/
[
ocessingML
.DocumentSettingsPart]
containing JaxbElement:ings
Part /word/
[
ocessingML
.StyleDefinitionsPart]
containing JaxbElement:
Part /word/media/
[
ocessingML
.ImageJpegPart]
遍历的docx
在样本目录显示您如何遍历一个的docx
JAXB的代表性。
关于JAXB的一个恼人的东西,是一个对象说一个表可以表示为
(如您所期望的)。 或者它可能被包装在一个
ement
在这种情况下,我得到了真正的表,你必须做的是这样
的:
if ( ((JAXBElement)o).getDeclaredType().getName().equals(
""
) )
任务型=()((JAXBElement)海外)。的getValue();
创建一个新的docx
要创建一个新的docx:
/ /创建包
WordprocessingMLPackage wordMLPackage = Package();
/ /保存它
(new ("") );
就是这样。
createPackage()
是一个方便的方法,它的作用:
/ /创建包
WordprocessingMLPackage wordMLPackage = new WordprocessingMLPackage();
/ /创建主文档的一部分(字/ )
MainDocumentPart wordDocumentPart = new MainDocumentPart();
/ /创建主文档的一部分内容
ObjectFactory factory = ObjectFactory();
body = factory .createBody();
nt wmlDocumentEl = factory .createDocument();
y(body);
/ /把在部分内容
bElement(wmlDocumentEl);
/ /添加主文档的一部分包关系
/ /(创造,如果有必要)
getPart(wordDocumentPart);
添加一段文字
MainDocumentPart
包含一个方法:
public .P addStyledParagraphOfText(String styleId, String text)
您可以使用该方法添加一个段落,使用指定的样式。
我们正在寻找的XML创建将是这样的:
<
w:p xmlns:w
="/wordprocessingml/2006/main"
>
<
w:r
>
<
w:t
>
Hello world
w:t
>
w:r
>
w:p
>
addStyledParagraphOfText
生成的JAXB对象结构的方式,并将其添加到文档中。
ObjectFactory factory = ObjectFactory();
/ /创建该段
.P para = P();
/ /创建文本元素
t = Text();
ue(simpleText);
/ /创建运行
.R run = R();
Content().add(t);
agraphContent().add(run);
/ /现在我们添加到文档的正文段
Body body = y();
lockLevelElts().add(para)
或者,您可以通过编组XML的一段:
/ /假设字符串XML包含以上XML
.P para = halString(xml);
对于这个工作,你需要确保所有的命名空间中声明的字符串正确。
添加部分
如果你想添加一个新的风格的一部分? 具体方法如下:
/ /创建一个样式的一部分
StyleDefinitionsPart stylesPart = new StyleDefinitionsPart();
/ /填充它默认风格
halDefaultStyles();
/ /添加样式的一部分主文档部分的关系
getPart(stylesPart);
你会采取同样的方法添加页眉或页脚。
当您添加一个这样的一部分,它会自动添加到源部分的关系的一部分。
一般来说,您还需要添加一个引用的部分(使用的关系身份证)到主文档的一部
分。 这适用于图像,标题和页脚。 (注释,脚注和尾注有一点不同,那是你添
加到主文档的一部分,是/脚注/尾注的个人意见,参考文献)。
的docx到(X)HTML的
docx4j 使用XSLT的docx转换为XHTML 1:
AbstractHtmlExporter exporter = new HtmlExporterNG2();
/ /注意:* 2 *有
/ /写入StreamResult(在这种情况下,输出流)
OutputStream os = new tputStream(inputfilepath + ".html"
);
Result result
= new Result(os);
(wordMLPackage, result,
inputfilepath + "_files"
);
你会发现生成的HTML是干净的。
docx4j 使用Java的XSLT扩展函数做繁重,所以对XSLT本身就是尽量简单。
的docx为PDF
docx4j 生产的XSL的,它可以反过来用于创建PDF。
目前,维克多被集成到Apache的 docx4j 用于创建PDF格式。 (不久,我们将
改变这么多的事 docx4j 生成的,由您首选使用的渲染,不管是维克多,或如
XEP商业工具)。
要创建一个PDF:
/ /字体身份映射微软Windows最佳
tMapper(
new IdentityPlusMapper());
/ /设置转换器
version c
= new sion(wordMLPackage);
/ /写入到输出流
OutputStream os = new tputStream(inputfilepath + ".pdf"
);
(os);
图像处理
当您添加一个图像到Word 2007文档中,一般增加一条,作为一个新的部分(ie
你会发现在产生的docx的一部分,包含base 64格式化图像)。
当您打开该文档中 docx4j, docx4j will create an image part representing
it.
它也可以创建一个链接的图像。 在这种情况下,图像不是嵌入的docx包,而是
正处于外部位置引用。
docx4j之
BinaryPartAbstractImage
类包含的方法,使您可以同时创建嵌入和链
接的图像以及适当的关系()。
/ **
*创建一个字节数组从所提供的图像的一部分,其附加到
*主要文件的一部分,并返回它.* /
public static BinaryPartAbstractImage createImagePart(WordprocessingMLPackage
wordMLPackage,
byte
[] bytes)
/ **
*创建一个字节数组从所提供的图像的一部分,其附加到源的一部分
*(如主文件的一部分,一个头的一部分等),并返回它.* /
public static BinaryPartAbstractImage createImagePart(WordprocessingMLPackage
wordMLPackage,
Part sourcePart, byte
[] bytes)
/ **
*创建一个链接的图像的一部分,并附作为其指定的源部分制造业│
*(例如一个头的一部分)
* /
public static BinaryPartAbstractImage createLinkedImagePart(
WordprocessingMLPackage wordMLPackage, Part sourcePart, String fileurl)
对于一个图像显示在文档中,我们还需要在适当的XML主文档的一部分。 这个
XML可以采取2基本形式:
在Word 2007 瓦特:绘制 表格
="0" distB ="0" distL ="0" distR ="0" > ="3238500" cy ="2362200" / > ="19050" t ="0" r ="0" b ="0" / > : : < a:blip r:embed ="rId5" / > : < / pic:blipFill> : < / pic:pic> < / a:graphicData> < / a:graphic> < / wp:inline> < / w:drawing> < / w:r> < / w:p> 在Word 2003的VML的 瓦特:的PICT 格式 ="_x0000_t75" coordsize ="21600,21600" .. > ="miter" / > : < / v:formulas> : < / v:shapetype> style ="width:428.25pt;height:321pt" > < v:imagedata r:id ="rId4" o:title ="" / > < / v:shape> < / w:pict> < / w:r> < / w:p> docx4j 可以创建Word 2007 瓦特:绘图/可湿性粉剂:内嵌 您形式: / ** * Create a *可链接或嵌入在w:对/瓦特:读/写:绘图。 * If the image is wider than the page, it will be scaled *自动。 查看Javadoc的其他签名。 * @帕拉姆库马拉 filenameHint,例如任何文字的原始文件名 * @帕拉姆库马拉 文本altText像HTML的ALT键 * @帕拉姆库马拉 分化抑制因子ID1一个独特的身份证明文件 * @帕拉姆库马拉 id2另一个独特的身份证明文件 * @帕拉姆库马拉 链接 ,如果这是真的要 联系不嵌入 * / public Inline createImageInline(String filenameHint, String altText, int id1, int id2, boolean link) 然后您可以添加到 瓦特:读/写:绘图。 最后, docx4j,你可以由Word格式转换(如PDF),不支持到PNG,这是一个 支持格式的图片。 为此, docx4j 使用 ImageMagick的。 因此,如果您想使 用此功能,您需要安装ImageMagick的。 docx4j 调用ImageMagick的使用: Process p = time().exec( "imconvert -density " + density + " -units PixelsPerInch - png:-" ); 注意名称 imconvert ,这是用来让我们没有提供一个完整路径执行官。 您需要 容纳的。 文本提取 一个快速的方法来提取文本从一个的docx,是使用 TextUtils public static void extractText(Object o, Writer w) 其中元帅它是通过一个SAX ContentHandler的传递的对象,以输出到作家的文 本。 文本替换 文本替换很容易,只要你是一个搜索字符串中是代表 表格对象在您的期望。 不过,这并不一定是如此。 该字符串可以在运行文本打破出于以下几个原因: 字部分的格式不同(例如在大胆) 拼写/语法 编辑命令(rsid) docx4j 最终将容纳这些案件,但不是现在。 除这一点,你可以在多种方式的文本替换,例如: 遍历主文档的一部分,看 对象 元帅为一个字符串,搜索/替换,那么和解组再次 docx4j s XmlUtils还包括: / ** *给一个包含WML的字符串$(key1),)$(key2,返回一个合适的 *对象.* / public static Object unmarshallFromTemplate(String wmlTemplateString, 的p 见UnmarshallFromTemplate的例子,在一个包含字符串操作: My favourite colour is ${colour} . < / w:t> < / w:r> < / w:p> > My favourite ice cream is ${icecream} . < / w:t> < / w:r> < / w:p> 提示和技巧 与平面的OPC XML格式 当你想看看里面一个docx文档,它是一个有点疼痛不得不把它解压到看一看有 关的部分。 有2个解决此方法。 一个是 /PackageExplorer ,可以解压缩的docx,和 漂亮的打印部分。 另一种方法是保存为Word XML文档(*. xml的docx)的。 这将产生一个XML 文件,您可以打开一个XML编辑器,如XPontus。 docx4j 可以打开单位的OPC XML文件,并保存它们。 要打开一个平面的OPC XML文件: WordprocessingMLPackage wordMLPackage = (new (inputfilepath)); 为了保存为扁平的OPC的XML: (new (outputfilepath)); 在这两种情况下,平OPC的代码将被用于当且仅当文件扩展名是。xml的。 记住UnmarshalFromString 当你操纵的docx文件,它是很有用的解组片段的XML(如字符串,表示一个段 落要插入到文档)。 例如,给定: < w:p xmlns:w ="/wordprocessingml/2006/main" > < w:r > < w:t > Hello world w:t > w:r > w:p > 您可以简单: / /假设字符串XML包含以上XML .P para = halString(xml); 克隆 要克隆一个JAXB对象,在XmlUtils使用下列方法之一: / **克隆这个JAXB对象,使用默认JAXBContext。 * / public static / **克隆这个JAXB对象* / public static @XmlRootElement 最常用的对象有一个 @ XmlRootElement 注释,这样他们就可以被整理和 unmarshalled。 在某些情况下,您可能会发现这个注释丢失。 如果您不能添加到JAXB注释的源代码,另一种是 马歇尔 它使用代码是明确的 担忧由此产生的QName。 例如,XmlUtils包含: / **元帅到W3C的文件,供对象 *缺少@ XmlRootElement注解。 * / public static nt marshaltoW3CDomDocument(Object o, JAXBContext jc, String uri, String local, Class declaredType) 你可以使用这像这样: CTFootnotes footnotes = nDocumentPart().getFootnotesPart().getJaxbElement().getValue(); CTFtnEdn ftn = tnote().get(1); / /没有对CTFtnEdn @ XmlRootElement,所以.. Document d = ltoW3CDomDocument( ftn, , _WORD12, "footnote" , CTFtnEdn. class ); 如果您需要解组,您可以使用: public static Object unmarshalString(String str, JAXBContext jc, Class declaredType) 该 docx4j 论坛 自由的社会中提供的支持 docx4j 座谈会上,在 /forums/ 这种讨论通常是在英国。 如果你能以温和的志愿者在您的语言论坛,请告诉我 们。 其他支持选项 如果自由社会的支持,可用 docx4j 论坛不能满足您的需求,或者您只是想外包 一些编码,欢迎您购买节目,咨询和优先支持 /m// 通过购买Plutext服务,你支持持续发展 docx4j。 路线图 2010字的支持。 机制,支持新的XML元素/字模式推出了2010年,和兼容性。 这是3.0标签的主要理由为。 网页出口商: 摆脱旧的; NG2的规范。 这样做是为了消除任何'是我应该用'混 乱,并集中精力/诀窍。 PDF格式出口商: viaXSLFO规范,并获得viaHTML摆脱viaIText和。 由于使 用HTML,这个想法是消除任何'我应该用'混乱,并集中精力/诀窍。 docx4j 可 以生产只,并在用户依靠维克多或有相当于实际生产PDF格式的XSL。 这将减 少依赖性,使 docx4j 打火机。 这样做的目的是要消除的fop罐(280万), PDF格式渲染罐(160万),iText的罐(1.1米),且核心渲染器(100万)。 字体处理: 删除潘糖的东西,所以我们并不需要一个定制的维克多罐子。 布局模型/中间格式: docx4j 包含DocumentModel,可以进一步发展,以支持: 搜索/替换 估算网页内容 样式,关闭部分,列出了 插入OLE对象:这样的电子表格,PDF文件等可以嵌入。 版本说明 这个文件是写在Word 2007中,使用: 漂亮的打印使用的XML /webTools/XmlPrettyPrint/ 或包资源 管理器 Java源代码格式化使用 PDF和HTML版本的使用产生 docx4j (通过的维克多的XSL和PDF格式)。 联系Plutext 除非你付出的支持,我怎么类型一般问题应直接向被张贴 docx4j forum 。 Plutext可以张贴到论坛的任何问题通过电子邮件应该已经向论坛接收。 Plutext可以在任何联系 *****************或 ******************* 1 /jive/?threadID=411 2 ,如果你得到错误'的访问限制:该类型 是不是中获得所需的库因限 制'(或许用一些与组合的Eclipse 3.4 /或JDK 6更新10?),你需要进入生 成标签路径的项目,图书馆,选择JRE的系统库,并添加一个访问规则,“无障 碍,**”。
发布评论