documents4j:Java文档格式转换开发库

为什么80%的码农都做不了架构师?>>>   hot3.png

http://hao.jobbole.com/documents4j/

documents4j:Java文档格式转换开发库

documents4j , Java , 文档处理工具

本资源由 伯乐在线 - 凝枫 整理

document4j是一个用来进行文档格式转换的Java工具库,它通过借助本机中支持指定文件格式到目标文件格式转换的应用,来实现整个转换的过程。

document4j 实现了Microsoft Word、Excel的适配功能,可以将docx文件转换为pdf文件,并且在这个过程中不会出现非微软文件转换出现的扭曲情况。

document4j提供了一个简单的API,并且有两个具体的实现:

本地策略

在本地版的实现策略中,document4j将指定文件的转换任务委派给本机中相应的应用程序。因此,为了保证正常运行,这台机器需要在后台预装好支持转换的软件,诸如Microsoft Word / Excel 。 document4j 提供了一套简单易用的机制允许用户注册自定义的转换器,同时将具体的实现细节和Microsoft Word / Excel 进行对接结合。

远程策略

在远程版的实现策略中,document4j将文档的转换工作通过REST-API的方式提供到远程的服务端进行转换。在这个过程中,请求方将文件与相关的格式转换信息发送到服务器端,转换完毕后,转换完成的文件将通过response的方式传输回来。

对于document4j的用户来说,这些实现方式都是完全透明的。因此,用户完全可以在本地开发与测试的时候,采用本地版的实现策略,而在生产环境中,完全透明地切换成远程实现模式。所以,后台转换功能也更容易进行模拟操作。

功能模块

documents4j-local

该模块包含本地实现策略LocalConverter的实现,支持在同一台机器上进行转换。

documents4j-transformer-msoffice-word

该模块包含对Microsoft Word的后台转换器。此后台转换器不能被直接使用,不过通过IConverter的实现模块比如document4j-local即可调用。当Microsoft Word转换器在ClassPath中的时候,将会被自动检测到。

documents4j-transformer-msoffice-excel

同上word

documents4j-client

该模块包含RemoteConverter的实现类,用来进行与服务端进行通信,传输文档。

documents4j-server

该模块包含了REST服务的实现策略,不过它必须依赖document4j-client模块。如果要创建一个服务器,需要用到ConversionServerBuilder。

documents4j-client-standalone

该模块包含RemoteConverter的一种脱机实现策略,你可以在命令行的方式下进行访问调用服务。你可以从这个页面the Bintray page of documents4j.来下载到该脱机的jar包

documents4j-server-standalone

该模块包含了一个转换服务器的脱机实现,同样可以通过命令行在进行调用。同上,相关的jar可以在这里下载。这个脱机的服务器对诸如 documents4j-transformer-msoffice-word 、documents4j-transformer-msoffice-excel 会有依赖,但有这样一条准侧:只有在需要这些后台模块的时候,才会加载。

示例

将Word转换为PDF

documents4j 有一套非常灵活的API。如上所述,这套API没有暴露任何的底层实现细节,每一个Converter都是IConverter的具体实现。下面是将一个Microsoft Word 文件转换成PDF文件的例子:

Java

 

1

2

3

4

5

6

7

File wordFile = new File( ... ), target = new File( ... );

IConverter converter = ... ;

Future conversion = converter

                                .convert(wordFile).as(DocumentType.MS_WORD)

                                .to(target).as(DocumentType.PDF)

                                .prioritizeWith(1000) // optional

                                .schedule();

 

Local converter

LocalConverter是IConverter的实现之一,它用来对文件进行本机范围内的转换。LocalConverter的创建例子如下:

Java

 

1

2

3

4

5

IConverter converter = LocalConverter.builder()

                           .baseFolder(new File("C:\Users\documents4j\temp"));

                           .workerPool(20, 25, 2, TimeUnit.SECONDS)

                           .processTimeout(5, TimeUnit.SECONDS)

                           .build();

根据配置,这个LocalConverter会将临时文件写入到指定的目录下。如果有此配置,document4j会随机创建一个目录。同时,你可以配置一个WorlPool来指定document4j最大能够支持同时执行多少文件转换任务。至于这个线程池的大小,一般来说,是由后台同时进行的Converter数量来定的,当然,这个值的确定也会一定程度上受到机器CPU与内存大小的影响。所以,一个最佳的值,往往都是来自于反复的试错。

Remote converter

IConverter的另一个实现RemoteConverter,它的创建过程和LocalConverter大同小异:

Java

 

1

2

3

4

5

6

IConverter converter = RemoteConverter.builder()

                           .baseFolder(new File("C:\Users\documents4j\temp"));

                           .workerPool(20, 25, 2, TimeUnit.SECONDS)

                           .requestTimeout(10, TimeUnit.SECONDS)

                           .baseUri("http://localhost:9998");

                           .build();

像LocalConverter一样,RemoteConverter也需要将临时文件写入到临时目录,如果没有指明的话也会自动创建。不过这次,WorkPool中文件转换任务都是远程转换的任务,所以的容量的指定需要考虑到远程转换与传输的超时时间。至于base URI参数,表示提供远程文件转换服务的服务器地址。请注意,所有IConvertergetSupportedConversionsisOperational 方法都是通过远程REST API来实现的,而且其中不会有任何的缓存机制。

Aggregating converter

除了LocalConverter和RemoteConverter,document4j中,还有一个继承于IConverter的IAggregatingConverter接口,它可以将文件转换执行过程委派到一系列后台的转换器中,具体的实现类是AggregationConverter。

这种扩展方式主要有三大目的:

  • 它可以让多个IConverter在同时执行多个转换任务时进行很好的负载均衡。默认情况下,一个AggregatingConverter的均衡策略是顺序循环,当然,开发者可以通过继承ISelectionStrategy去自定义均衡策略。
  • 在创建完AggregatingConverter之后,IAggregatingConverter接口支持对聚合的IConverter进行灵活的注册与卸载。因此,这样可以在不用重启应用的情况下迁移到另外的文件转换服务器中,也可以重新启动一个本地转换器。
  • 只需要通过一个IConverter实例便可以支持多种不同的文件转换格式的接口实现。

AggregatingConverter的创建方式与LocalConverter和RemoteConverter类似,同样允许自行定义转换器的特性:

Java

 

1

2

3

4

5

6

7

8

9

10

IConverter first = ... , second = ... ;

 

IConverterFailureCallback converterFailureCallback = ... ;

ISelectionStrategy selectionStrategy = ... ;

 

IAggregatingConverter converter = AggregatingConverter.builder()

                                      .aggregates(first, second)

                                      .selectionStrategy(selectionStrategy)

                                      .callback(converterFailureCallback)

                                      .build();

请注意,如果一个AggregatingConverter中聚合的某一个Converter出现不可用的故障,虽然在最终这个聚合转换器能够侦测到其中不可用的模块,但是整个AggregatingConverter也将无法保证本次转换的完全成功运行。因此,建议去通过IConverterFailureCallback注册一个回调监听,当然,也可以通过常规的心跳健康检查机制去检测创建转换器是否正常,所以,一个不可用的Converter将可以在指定的时间段内检测到。

开发资源

  • 下载
  • API(javadoc)
  • 问答:StackOverflow中搜索documents4j标签
    • 邮件列表

协议

documents4j遵循Apache 2.0开源协议发布。

官方网站:http://documents4j.com
开源地址:https://github.com/documents4j/documents4j

转载于:https://my.oschina.net/huqiji/blog/1506892

你可能感兴趣的:(java)