永中DCS产品文档
基本信息
永中文档在线预览软件(Document Conversion Service,简称DCS)是通过解析常用办公文档的格式,提供不同文档格式间的相互转换,实现常用格式文档的阅读等服务。 DCS能直接部署在Windows或Linux网络操作系统上,与Web 服务器、邮件服务器等配合,提供Office文档阅读及批量转换功能。 永中DCS支持阅读和转换的文档格式非常丰富,涵盖微软Office 97~2013、PDF、UOF和OFD等常用文档格式,同时可根据用户需求进行特定格式的合作。
在使用方式方面,支持永中文档转换组件(Document Conversion Component,简称DCC)和DCS服务器(DCS Server)两种使用方式:前者是jar包调用(DCC),主要适合java语言调用;后者为http请求方式调用,支持各种开发语言以标准Web服务方式提供调用,如搭配负载均衡服务器,可部署到多台服务器上并发使用,实现集群部署。 在输出网页效果方面,新增高清版网页效果支持。可在网页中展示与Office中显示一致的原版式、支持无极缩放和复制文本内容的高清版面效果。 具体支持格式见下表:
| 源格式 | 目标格式(图像包括JPG、PNG、BMP、TIFF等) | 说明 |
| XLS、XLSX | HTML/PDF/UOF/TXT/CSV/图像/EIO | 微软文档格式 |
| PPT、PPTX | HTML/PDF/UOF/TXT/图像/EIO | |
| DOC、DOCX | HTML/PDF/UOF/TXT/图像/EIO | |
| RTF | HTML/PDF/UOF/TXT/图像/EIO | RTF文档格式 |
| EIO | HTML/PDF/UOF/TXT/图像/DOC/XLS/PPT | 永中Office格式 |
| UOF、UOS | HTML/PDF/TXT/图像/DOC/XLS/PPT | 中文办公软件文档标准格式 |
| XML | HTML/PDF/UOF/TXT/图像/DOC/XLS/PPT | XML文档格式 |
| PNG | Adobe阅读PDF文档格式 | |
| Office文档 | OFD | 中文版式文档格式 |
版本信息:
V3.1(2016.04.04):直接打开zip、rar等常见压缩格式文档,方便用户直接查看压缩文件内的文档。
水印内容可由用户自定义,比如用户ID、公司名称、邮件名称等,能起到宣传或防泄密等作用。
用户在设置防复制功能后,将无法选中复制文档中的文字,可以保护用户文档的私密性和安全性。
政府、学校等网站上有大量的包含Office附件的公告、告示和通知等,用户使用时一般需要下载到本地后才能利用Office打开查阅,使用不太方便。经研究开发,只需要在网站页面增加一句嵌入代码,就可以实现自动搜索和匹配当前页面的Office文档并提供快速预览功能。 示例 示例2
1、增加了左侧缩略图
2、增加了幻灯片放映功能
3、增加了键盘控制上一页下一页事件
1、优化后的doc/docx文档大小为原先的四分之一,提升了转换性能
2、解决了浏览器复制粘贴后乱码问题
3、解决了浏览器无法搜索词组的问题
1、改进excel格式文档IE8浏览器中图片的显示
2、改进ppt格式文档IE8浏览器的显示功能
3、解决用户在云平台部署dcs服务的授权问题
V3.2(2016.11.08):
DCS服务
运行环境:
jre8、apache-tomcat-8.0.26、nginx以及转换所需的字体。
部署流程(linux下):
▪ 安装JDK8
这里使用的是压缩版的JDK
解压文件
tar -zxvf jdk-8u60-linux-x64.tar.gz
修改环境变量 vi /etc/profile
JAVA_HOME=/home/admin/web/jdk8
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
并让配置文件生效
source /etc/profile
在终端使用echo命令检查环境变量设置情况:
#echo $JAVA_HOME
#echo $CLASSPATH
#echo $PATH
检查JDK是否安装成功:
#java –version
▪ Tomcat的配置部署解压文件
tar -zxvf apache-tomcat-8.0.26.tar.gz
▪ 部署DCS工程把永中DCS工程目录复制到tomcat 的webapp目录下。
修改${tomcat.home}\conf\server.xml文件.在Host节点下增加如下参考代码:
<Context docBase="指向项目的根目录所在的路径" path="虚拟目录名" reloadable="true"/>
根据需要修改项目中 ${dcs.web}\WEB-INF\config.properties和log4j.properties的配置。需要在目录/usr/X11R6/lib/X11/fonts/TrueType下加入字体文件。
启动tomcat后,访问http://localhost:8080/dcs.web 即可看到“在线文档预览示例”页面。
▪ 安装nginx
tar -zxvf nginx-1.9.2.tar.gz
进入 nginx 文件夹 cd nginx-1.9.2 执行 ./configure 可能会遇到系统缺少库
问题:
1:./configure: err: C compiler cc is not found
缺少gc++库文件
su root
cd /
yum -y install gcc gcc-c++ autoconf automak
等待 complete2:./configure: error: the HTTP rewrite module requires the PCRE library
su root
yum -y intall pcre pcre-devel
等待complete3:./configure:error: the HTTP gzip module requires the zlib library
yun -y install zlib zlib-devel
解决所有问题后 再次
./configure
make
make install
安装完成后对/usr/local/nginx/conf/nginx.conf 配置文件进行所需配置。集群配置
按以上步骤在多台服务器上安装配置好tomcat 并启动,确认tomcat 启动成功,在nginx服务配置文件nginx.conf中进行集群相关配置。
例如三台服务器,其中192.168.1.100为ngnix服务器,192.168.1.101为第一台DCS服务器,192.168.1.102为第二台服务器,
则nginx.conf相关配置为:
#设定负载均衡的服务器列表
upstream
tomcat_server {
server 192.168.1.101:80;
server 192.168.1.102:80;
}
注意: windows 及 mac os下,jdk请尽量使用安装包.exe,.dmg安装,安装程序将自动配置环境变量。linux下如果遇到如下提示
-bash: /usr/java/jdk1.8.0_65/bin/java: Permission denied
则表明文件或文件夹没权限,请执行如下操作
chmod -R 777 /usr/java/jdk1.8.0_65
部署流程(windows下):
▪ 安装JDK8
首先下载JDK,下载页面地址:
http://www.oracle.com/technetwork/java/javase/downloads/index.html;
修改环境变量:右击“计算机”,在右键菜单中点击“属性”,在弹出窗口中点击“高级系统设置”,选择“高级”选项卡,点击“环境变量”按钮;
需要设置三个属性“JAVA_HOME”、“path”、“classpath”。
一:点“新建”,然后在变量名写上JAVA_HOME,然后在变量值写入刚才安装的路径“C:\jdk1.8”。
二:其次在系统变量里面找到path,然后点编辑,path变量的含义就是系统在任何路径下都可以识别java命令,则变量值为“.;%JAVA_HOME%\bin”,(其中“%JAVA_HOME%”的意思为刚才设置JAVA_HOME的值),也可以直接写上“C:\jdk1.6\bin”
三: 最后再点“新建”,然后在变量名上写classpath,该变量的含义是为java加载类(class or lib)路径,只有类在classpath中,java命令才能识别。其值为“.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\toos.jar (要加.表示当前路径)”,与相同“%JAVA_HOME%有相同意思” 检查JDK是否安装成功:
#java –version
▪ Tomcat的配置部署tomcat下载页面地址:
http://tomcat.apache.org/
解压文件▪ 部署DCS工程
把永中DCS工程目录复制到tomcat 的webapp目录下。
修改${tomcat.home}\conf\server.xml文件.在Host节点下增加如下参考代码:
<Context docBase="指向项目的根目录所在的路径" path="虚拟目录名" reloadable="true"/>
根据需要修改项目中 ${dcs.web}\WEB-INF\config.properties和log4j.properties的配置。需要在目录/usr/X11R6/lib/X11/fonts/TrueType下加入字体文件。
启动tomcat后,访问http://localhost:8080/dcs.web 即可看到“在线文档预览示例”页面。
▪ 安装nginx
nginx下载页面地址:
http://nginx.org/
安装完成后对/usr/local/nginx/conf/nginx.conf 配置文件进行所需配置。集群配置
按以上步骤在多台服务器上安装配置好tomcat 并启动,确认tomcat 启动成功,在nginx服务配置文件nginx.conf中进行集群相关配置。
例如三台服务器,其中192.168.1.100为ngnix服务器,192.168.1.101为第一台DCS服务器,192.168.1.102为第二台服务器,
则nginx.conf相关配置为:
#设定负载均衡的服务器列表
upstream
tomcat_server {
server 192.168.1.101:80;
server 192.168.1.102:80;
}
接口说明:
▪ 上传文档请求地址:
POST http://服务器地址/upload
例如:http://localhost:8080/dcs.web/upload
上传您要在线预览的文档。
参数:
file - 文件作为multi-part POST请求参数,用于上传本地文档 (必须)
convertType - 转换类型参数(必须)
▪ URL预览文档
请求地址:
POST http://服务器地址/onlinefile
参数:
downloadUrl - 文档URL,用于预览网络文档。此URL应为编码(UTF-8 URL-encoded)后的URL。
convertType - 转换类型参数
(cookie) - (非必传)下载文件所需的cookie信息
▪ 服务器本地转换
请求地址:
POST http://服务器地址/convert
参数:
inputDir - 文档在服务器上的路径(相对于配置文件中input的相对路径)
(mergeInput) - (非必传)使用文档合并功能时,需要合并的文档路径同inputDir,可传多个值,以英文,分隔
convertType - 转换类型参数
▪ html网页转pdf
请求地址:
POST http://服务器地址/htmltopdf
参数:
htmlurl - 需要转换的html地址
通用参数不适用于此接口
▪ 文档转swf
请求地址:
POST http://服务器地址/anytoswf
参数:
Type - upload/onlinefile/convert
upload-文件上传参数:
file - 文件作为multi-part POST请求参数,用于上传本地文档 (必须)
onlinefile-Url下载参数:
downloadUrl - 文档URL,用于预览网络文档。此URL应为编码(UTF-8 URL-encoded)后的URL。
convert-服务器本地转换参数:
inputDir - 文档在服务器上的路径(相对于配置文件中input的相对路径)
通用参数不适用于此接口
▪ 获取授权码
请求地址:
http://服务器地址/getRegisterCode
▪ 查询版本及授权到期情况
请求地址:
http://服务器地址/queryInfo
▪ 查询实时可用实例个数
请求地址:
http://服务器地址/countConverter
<通用参数>
htmlName - 转换成html显示的文档名字(默认值:原文档名字)
htmlTitle - 转换成html显示的htmltitle名字(默认值:永中文档转换服务)
isCopy - 是否防复制(1是0否,默认0)
isShowAll - 是否一次性加载(1是0否,默认0(分页加载))
isZip - 是否提供打包下载(1是0否,默认0),返回值增加 zipUrl结果
isShowTitle - 是否显示文件名(1是0否,默认1)
isDelSrc - 是否删除源文件(1是0否,默认0)
isDelTarget - 是否删除生成的文件(1是0否,默认0,需要isZip为1时才生效)
isSourceDir - 是否在结果集中返回源文档相对路径
isShowList - 是否显示文档目录(1是0否,默认0)
showFooter - 是否显示页脚(1是0否)
encoding - 转换时所需要的编码(默认值:UTF-8)
password - 转换文档如有密码通过这个参数传入密码
callbackName - 用于跨域调用时设置回调函数的名字(会改变返回值的样式)
pages - 应用于转换成多个文件时(如MS到图片格式,转多个SVG),以 英文标识,逗号 分隔 ;-表示 范围 例如(1,3-5 表示 1,3,4,5)
wmSize - 设置水印尺寸默认100(int类型)
wmContent - 设置水印文字内容默认水印
wmFont - 设置水印字体
zoom - 设置图片的缩放比例(默认1f)
wmColor - 设置水印颜色(int类型)
1,"黑色"、2,"蓝色"、3,"青色"、4,"深灰" 、5,"灰色"、6,"绿色"、7,"浅灰" 、8,"品红"、
9,"橙色"、10,"粉红"、11,"红色"、12,"白色" 、13,"黄色"
转换类型参数说明:
wmPicPath - 设置图片水印的图片路径(相对于配置文件中WmImagePath的相对路径)
acceptTracks - 是否显示文档批注(1显示0不显示)
isHideBlank - 是否隐藏空白(1隐藏0不隐藏)
isVertical - 是否竖排(1是0否,默认0)
isPrint - 是否显示打印(1是0否,默认1)
isDownload - 生成页面是否提供原文档下载(1是0否,默认0)
htmlPath - 自定义生成html中的相对路径
isShowNum - 是否显示总页数(1显示,0不显示,默认1)
dynamicMark - 动态水印内容
destinationName - 自定义生成的文件名(不需要后缀,不推荐使用)
appendPath - 自定义在设置的output路径的基础上追加路径(不推荐使用)
0-----文档格式到高清html的转换
1-----文档格式到html的转换
2-----文档格式到txt的转换
3-----文档格式到pdf的转换
4-----文档格式到gif的转换
5-----文档格式到png的转换
6-----文档格式到jpg的转换
7-----文档格式到tiff的转换
8-----文档格式到bmp的转换
9-----pdf文档格式到gif的转换
10----pdf文档格式到png的转换
11----pdf文档格式到jpg的转换
12----pdf文档格式到tiff的转换
13----pdf文档格式到bmp的转换
14----pdf文档格式到html的转换
15----html文档格式到微软文档格式的转换
16----文档转换多个SVG返回分页加载页面(模版)
17----tif文件转成html
18----文档转换多个SVG
19----压缩文件到html的转换(模版)
20----PDF文件到html的转换(模版)
21----ofd文件到html的转换(模版)
22----两个doc文档合并
23----图片到html的转换
24----pdf文档格式到txt的转换
25----文档按页转换(高清版)
26----文档按页转换(标准版)
27----获取文档页码(MS文档)
28----获取pdf页码(PDF文件)
29----文档到ofd的转换
30----文档到html(图片)的转换
31----多个pdf文档合并
返回参数说明: result - 返回代码,0成功,其他失败message - 详细信息
data - 请求需要返回的数据
返回参数含义:
0-----转换成功
1-----找不到指定文档
2-----无法打开指定文档
3-----操作失败
4-----转换的文档为加密文档或密码有误,请重新添加password参数进行转换
5-----输出文档后缀错误
6-----授权文件过期
7-----转换超时,内容可能不完整
8-----无效参数
17-----上传失败
18-----下载文件失败
19-----文件过大
20-----下载成功
21-----删除失败
22-----获取文件信息失败
23-----URL编码失败
24-----生成文件名为空,有误或重名,请检查参数
25-----html转pdf转换失败
例如:成功状态下:{ "result":0,"data":"http://xxxx域名/文件地址","message":"转换成功" }
失败状态下: { "result":7, "":"上传失败" }
调用说明:
WEB调用
Web调用需要配置jquery组件,用到ajax,需要配置ajaxfileupload.js。web要视具体情况来编写代码,下面代码为核心调用部分。a) 上传本地文件转换代码示例
$('#upfilebtn2').fileupload({
url : 'upload',
dataType : 'json',
formData : {
convertType : "0"
},//如果需要额外添加参数可以在这里添加
done : function(e, data){
$.isLoading("hide");
},
});
b) URL文档转换代码示例
$.ajax({
url : "onlinefile",
data :{
"downloadUrl" : obj_value,
convertType : "0"
},
dataType : "json",
type : "post",
success : function(data){
$.isLoading("hide");
},
error : function(data){
$.isLoading("hide");
console.error(data)
}
});
客户端调用客户端调用接口,需要用POST请求,具体代码需要视开发语言而定,下面列举部分语言作为参考。
Java调用
Java 调用代码适用于J2SE及Java EE。需要用到的第三方工具包为:commons-logging-1.1.jar,httpclient-4.5.jar,httpcore-4.4.1.jar,httpmime-4.5.jar,如代码出现编译不过,请加入这四个包。
代码编译环境:Eclipse
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
/**
* @Description: DCS文档转换服务Java调用代码示例
* @author LB
* @date 20151014
*/
public class DCSTest {
public static String sendPost(String serverurl,Map< String,String> param){
String result="";
List< NameValuePair> list = new ArrayList< NameValuePair>();
String fullurl ="";
//请求参数
for(String key : param.keySet()) {
list.add(new BasicNameValuePair(key, param.get(key)));
}
try{
fullurl = EntityUtils.toString(new UrlEncodedFormEntity(list, Consts.UTF_8));
}catch(Exception e){
result ="下载失败";
e.printStackTrace();
}
HttpPost httpget = new HttpPost(serverurl+"?"+fullurl);
CloseableHttpClient httpclient = HttpClients.createDefault();
try (CloseableHttpResponse response = httpclient.execute(httpget)){
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
result = EntityUtils.toString(entity);
}else{
result="下载失败";
}
} catch (Exception e) {
result="下载失败";
e.printStackTrace();
} finally{
httpget.releaseConnection();
}
return result;
}
/**
* 向指定 URL 上传文件POST方法的请求
*
* @param url 发送请求的 URL
* @param filepath 文件路径
* @param type 转换类型
* @return 所代表远程资源的响应结果, json数据
*/
public static String SubmitPost(String url, String filepath, String type) {
String requestJson = "";
HttpClient httpclient = new DefaultHttpClient();
try {
HttpPost httppost = new HttpPost(url);
FileBody file = new FileBody(new File(filepath));
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null,
Charset.forName("UTF-8"));
reqEntity.addPart("file", file); // file为请求后台的File upload;属性
reqEntity.addPart("convertType", new StringBody(type, Charset.forName("UTF-8")));
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
HttpEntity resEntity = response.getEntity();
requestJson = EntityUtils.toString(resEntity);
EntityUtils.consume(resEntity);
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// requestJson = e.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// requestJson = e.toString();
} finally {
try {
httpclient.getConnectionManager().shutdown();
} catch (Exception ignore) {
}
}
return requestJson;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// 文件上传转换
String convertByFile = SubmitPost("http://dcs.yozosoft.com:80/upload", "C:/doctest.docx", "1");
// 网络地址转换
Map< String,String> map =new HashMap< String,String>();
map.put("downloadUrl", "http://www.yozodcs.com/example/doc/doctest.docx");
map.put("convertType", "1");
String convertByUrl =sendPost("http://dcs.yozosoft.com/onlinefile",map);
System.out.println(convertByFile);
System.out.println(convertByUrl);
}
}
httpclient4.x版本调用
//上传文件
public static String postParams(String url, String filepath, String type) {
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String result = null;
try {
HttpPost httpPost = new HttpPost(url);
MultipartEntityBuilder mEntityBuilder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
mEntityBuilder.setCharset(Charset.forName("UTF-8"));
FileBody file = new FileBody(new File(filepath));
mEntityBuilder.addPart("file", file);
StringBody comment = new StringBody(type, ContentType.APPLICATION_JSON);
mEntityBuilder.addPart("convertType", comment);
HttpEntity reqEntity =mEntityBuilder.build();
httpPost.setEntity(reqEntity);
response = httpclient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
HttpEntity resEntity = response.getEntity();
result =EntityUtils.toString(resEntity);
EntityUtils.consume(resEntity);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
HttpClientUtils.closeQuietly(httpclient);
HttpClientUtils.closeQuietly(response);
}
return result;
}
C++调用
C++调用,需要通过socket封装http请求,本例展示URL调用方法,文件上传类似。编译环境VS2005,win32控制台
// DCSTest.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include "DCSTest.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 唯一的应用程序对象
CWinApp theApp;
#include iostream
#include string
#include Winsock2.h
using namespace std;
//函数声明
int httpPost(char* hostname, char* api, char* parameters);
//方法调用
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
return 1;
}
httpPost("dcs.yozosoft.com", "http://dcs.yozosoft.com:80/onlinefile", "downloadUrl=http://img.iyo
cloud.com:8000/doctest.docx&convertType=1");
system("pause");
return nRetCode;
}
/*
*post 请求
*参数:hostname 域名
* api 接口
* parameters 参数,请求参数应该是name1=value1&name2=value2 的形式。
*返回:正确0,否则,错误代码
*/
int httpPost(char* hostname, char* api, char* parameters)
{
WSADATA WsaData;
WSAStartup(0x0101, &WsaData);
//初始化socket
struct hostent* host_addr = gethostbyname(hostname);
if (host_addr == NULL)
{
cout<<"Unable to locate host";
return -103;
}
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons((unsigned short)80);
sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list);
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1)
{
return -100;
}
//建立连接
if (connect(sock, (const struct sockaddr *)&sin, sizeof(sockaddr_in) ) == -1)
{
cout<<"connect failed";
return -101;
}
//初始化发送信息
char send_str[2048] = {0};
//头信息
strcat(send_str, "POST ");
strcat(send_str, api);
strcat(send_str, " HTTP/1.1\r\n");
strcat(send_str, "Host: ");
strcat(send_str, hostname);
strcat(send_str, "\r\n");
strcat(send_str, "Connection: keep-alive\r\n");
char content_header[100];
sprintf(content_header,"Content-Length: %d\r\n", strlen(parameters));
strcat(send_str, content_header);
strcat(send_str, "Cache-Control: max-age=0\r\n");
strcat(send_str, "Origin: http://dcs.yozosoft.com\r\n");
strcat(send_str, "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like G
ecko) Chrome/15.0.849.0 Safari/535.1\r\n");
strcat(send_str, "Content-Type: application/x-www-form-urlencoded\r\n");
strcat(send_str, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r
\n");
strcat(send_str, "Referer: http://dcs.yozosoft.com/\r\n");
strcat(send_str, "Accept-Encoding: gzip,deflate,sdch\r\n");
strcat(send_str, "Accept-Language: zh-CN,zh;q=0.8\r\n");
//内容信息
strcat(send_str, "\r\n");
strcat(send_str, parameters);
if (send(sock, send_str, strlen(send_str),0) == -1)
{
cout<<"send failed";
return -101;
}
//获取返回信息
char recv_str[4096] = {0};
if (recv(sock, recv_str, sizeof(recv_str), 0) == -1)
{
cout<<"recv failed";
return -101;
}
cout<<"recv_str";
WSACleanup( );
return 0;
}
PHP调用
Ⅰ URL Post请求
$url="http://dcs.yozosoft.com/onlinefile";
$uri="http://dcs.yozosoft.com/example/doc/doctest.docx";
$response=onlinefile($url, $uri);
echo $response;
function onlinefile($url, $uri)
{
$data=array('downloadUrl'=> 'http://dcs.yozosoft.com/example/doc/doctest.docx','convertType'=> '1');
$data = http_build_query($data);
$params = array('http' => array(
'method' => 'POST',
'content' => $data
)
);
print_r($params);
$ctx = stream_context_create($params);
$fp = file_get_contents($url, false, $ctx);
if (!$fp) {
return false;
}
return $fp;
}
Ⅱ 上传文件
function send_file($url, $post = '', $file = '') {
$eol = "\r\n";
$mime_boundary = md5 ( time () );
$data = '';
$confirmation = '';
date_default_timezone_set ( "Asia/Beijing" );
$time = date ( "Y-m-d H:i:s " );
$post ["filename"] = $file [filename];
foreach ( $post as $key => $value ) {
$data .= '--' . $mime_boundary . $eol;
$data .= 'Content-Disposition: form-data; ';
$data .= "name=" . $key . $eol . $eol;
$data .= $value . $eol;
}
$data .= '--' . $mime_boundary . $eol;
$data .= 'Content-Disposition: form-data; name=' . $file [name] . '; filename=' . $file [fi
lename] . $eol;
$data .= 'Content-Type: text/plain' . $eol;
$data .= 'Content-Transfer-Encoding: binary' . $eol . $eol;
$data .= $file [filedata] . $eol;
$data .= "--" . $mime_boundary . "--" . $eol . $eol;
$params = array ('http' => array ('method' => 'POST', 'header' => 'Content-Type: multipart/
form-data;boundary=' . $mime_boundary . $eol, 'content' => $data ) );
$ctx = stream_context_create ( $params );
$response = file_get_contents ( $url, FILE_TEXT, $ctx );
return $response;
}
C#调用
Ⅰ URL Post请求
public string HttpPost(string Url, string postDataStr)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);
request.CookieContainer = cookie;
Stream myRequestStream = request.GetRequestStream();
StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));
myStreamWriter.Write(postDataStr);
myStreamWriter.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
response.Cookies = cookie.GetCookies(response.ResponseUri);
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
Ⅱ 上传文件
public static string HttpUploadFile(string url, string path)
{
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = true;
request.Method = "POST";
string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
int pos = path.LastIndexOf("\\");
string fileName = path.Substring(pos + 1);
//请求头部信息
StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName));
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
byte[] bArr = new byte[fs.Length];
fs.Read(bArr, 0, bArr.Length);
fs.Close();
Stream postStream = request.GetRequestStream();
postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
postStream.Write(bArr, 0, bArr.Length);
postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
postStream.Close();
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream instream = response.GetResponseStream();
StreamReader sr = new StreamReader(instream, Encoding.UTF8);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
return content;
}
JVM调优说明 :
关于DCS中实例数的设置:我们一般推荐客户按照服务器的硬件条件来设置例如服务器可用为4核配8G内存,并发可设置4-8个,我们推荐1核1g内存设置1个并发实例
tomcat的性能优化:
根据设置的实例数和服务器剩余内存数来设置jvm的内存设置
Ⅰ window下:
在window下的tomcat/bin下的catalina.bat中首行加入set JAVA_OPTS=-Xms***m -Xmx***m
Ⅱ Linux下:
在linux下的tomcat/bin下的catalina.sh中首行加入JAVA_OPTS="$JAVA_OPT -Xms***m -Xmx***m"
其中Xms表示启动所需最小内存,Xmx表示可用最大内存,***根据实际情况设置
DCC组件
永中文档转换组件(Document Conversion Component,简称DCC)通过解析常用办公文档的格式,提供不同文档格式间的互转,实现常用格式文档的阅读等服务。永中DCC 主要部署在网络服务器上,如Web 服务器、邮件服务器等,提供用户文档阅读及批量文档转换功能。永中DCC 支持阅读和转换的文档格式非常丰富,涵盖微软Office 97~2013等常用文档格式,同时可根据用户需求进行特定格式的合作。运行环境:
a) 操作系统:任何可以安装sun 标准版jre的Windows/ Linux
b) 安装软件要求:
机器必须安装java运行环境
c) Linux下特殊要求(转图片,转pdf时需要):
需要添加中文字体文件比如:yzdwsj6.ttf
配置:
a)Config放置在Yozo_Office.jar同一目录下,且文件名字不可随意更改b)EMedia.jar、jai_codec.jar、jai_core.jar等为引用包,开发调试时请导入工程
类介绍:
a) applicaton.dcs.Convert类文档转换引擎对象,支持多线程,提供各种转换方法。
b) applicaton.dcs.IPICConvertor接口
文档转换图片接口,提供了丰富的转图片方法。转图片前预先可知图片数量,图片大小。
c) 接口API介绍
//方法返回错误代码convertMStoPic方法,convertPDFtoPic方法
int resultcode();
//获取转换的图片数量
int getpagecount()
//每页的100%真实的宽高
float[][] getAllpagewheigths()
//起始页,结束页,缩放值,转换存放的文件夹,起始页从0开始。假设起始页==结束页,则只转换1页。如果结束页为-1,则转换所有。生成的文件名。页码+后缀名,从1开始,zoom范围0.1f-5.0f
int converttoGIF(int start,int end,float zoom, String tarfoldname)
int converttoPNG(int start,int end,float zoom, String tarfoldname)
int converttoJPG(int start,int end,float zoom, String tarfoldname)
int converttoTIFF(int start,int end,float zoom, String tarfoldname)
int converttoBMP(int start,int end,float zoom, String tarfoldname)
//关闭,内存回收
void close()
API介绍:
构造器:Convert() 默认构造器
Convert(String path)
参数:path Config文件夹的路径,默认是放置在Yozo_Office.jar同一目录下
下面通过程序实例来介绍其主要方法。
API:
int convertMStoHTML (String sourceFileName,String targetFileName)
功能:该接口实现指定MS文件到html文件的转换(标清版本)
参数:sourceFileName 源文件绝对路径(包含文件名和后缀名)
targetFileName目标文件绝对路径
返回值:
0-----转换成功
1-----传入的文件,找不到
2-----传入的文件,打开失败
3-----转换过程异常失败
4-----传入的文件有密码
5-----targetFileName的后缀名错误
使用范例:
String sourceFileName = "D:/test/input/a.doc";
String targetFileName = "D:/test/output/a.htm";
Convert convert = new Convert();
convert.convertMStoHTML (sourceFileName, targetFileName);
运行结果:将D:/test/input/路径下a.doc文件转换为对应的htm文件,存放到D:/test/output文件夹下API:
int convertMStoHtmlOfSvg (String sourceFileName,String targetFileName)
功能:该接口实现指定MS文件到html文件的转换(高清版本)
参数:sourceFileName 源文件绝对路径(包含文件名和后缀名)
targetFileName目标文件绝对路径
返回值:
0-----转换成功
1-----传入的文件,找不到
2-----传入的文件,打开失败
3-----转换过程异常失败
4-----传入的文件有密码
5-----targetFileName的后缀名错误
使用范例:
String sourceFileName = "D:/test/input/a.doc";
String targetFileName = "D:/test/output/a.htm ";
Convert convert = new Convert();
convert. convertMStoHtmlOfSvg (sourceFileName, targetFileName);
运行结果:将D:/test/input/路径下a.doc文件转换为对应的htm文件,存放到D:/test/output文件夹下API:
IHtmlConvertor convertMStoHtml(String srcfilename)
功能:该接口实现指定MS文件到html转换器
参数:sourceFileName 源文件绝对路径(包含文件名和后缀名)
返回值:实现IHtmlConvertor接口对象
使用范例:
String sourceFileName = "D:/test/input/a.doc";
String targetFileDir = "D:/test/output ";
Convert convert = new Convert();
IHtmlConvertor html = convert. convertMStoHtml (sourceFileName);
int resultcode = html. resultcode();
if(resultcode == 0)
{
html. convertToHtml(0,1,targetFileDir)
}
html.close();
运行结果,a.doc文档,其中前2页转换成html。网页存放的目录为D:/test/outputAPI:
int convertMStoTXT (String sourceFileName,String targetFileName)
功能:该接口实现指定MS文件到txt文件的转换
参数:sourceFileName 源文件绝对路径(包含文件名和后缀名)
targetFileName目标文件绝对路径
返回值:
0-----转换成功
1-----传入的文件,找不到
2-----传入的文件,打开失败
3-----转换过程异常失败
4-----传入的文件有密码
5-----targetFileName的后缀名错误
使用范例:
String sourceFileName = "D:/test/input/a.doc";
String targetFileName = "D:/test/output/a.txt ";
Convert convert = new Convert();
convert. convertMStoTXT (sourceFileName, targetFileName);
运行结果:将D:/test/input/路径下a.doc文件转换为对应的txt文件,存放到D:/test/output文件夹下API:
int convertMStoPDF (String sourceFileName,String targetFileName)
功能:该接口实现指定MS文件到PDF文件的转换
参数:sourceFileName 源文件绝对路径(包含文件名和后缀名)
targetFileName目标文件绝对路径
返回值:
0-----转换成功
1-----传入的文件,找不到
2-----传入的文件,打开失败
3-----转换过程异常失败
4-----传入的文件有密码
5-----targetFileName的后缀名错误
使用范例:
String sourceFileName = "D:/test/input/a.doc";
String targetFileName = "D:/test/output/a.pdf ";
Convert convert = new Convert();
convert. convertMStoPDF (sourceFileName, targetFileName);
运行结果:将D:/test/input/路径下a.doc文件转换为对应的htm文件,存放到D:/test/output文件夹下API:
boolean convertHTMLtoMS (String sourceFileName,String targetFileDir)
功能:该接口实现指定html文件到MS文件的转换
参数:sourceFileName 源文件绝对路径(包含文件名和后缀名)
targetFileDir目标文件夹绝对路径
返回值:true,转换成功,false 转换失败
使用范例:
String sourceFileName = "D:/test/input/a.html";
String targetFileDir = "D:/test/output ";
Convert convert = new Convert();
convert. convertHTMLtoMS (sourceFileName, targetFileDir);
运行结果:将D:/test/input/路径下a.html文件转换为对应的MS文件(doc或者xls或者ppt,转换成何种格式由程序智能判别,无须指定),存放到D:/test/output文件夹下API:
IPICConvertor convertMStoPic(String srcfilename)
功能:该接口实现指定MS文件到图片转换器
参数:sourceFileName 源文件绝对路径(包含文件名和后缀名)
返回值:实现IPICConvertor接口对象
使用范例:
String sourceFileName = "D:/test/input/a.doc";
String targetFileDir = "D:/test/output ";
Convert convert = new Convert();
IPICConvertor picc = convert. convertMStoPic (sourceFileName);
int resultcode = picc. resultcode();
if(resultcode == 0)
{
picc. converttoGIF(0,2,0.5f,targetFileDir)
}
picc.close();
运行结果,a.doc文档,其中2页转换成图片,图片比率是0.5。图片存放的目录为D:/test/outputAPI:
IPICConvertor convertPDFtoPic(String srcfilename)
功能:该接口实现指定PDF文件到图片转换器,目前只支持转换成png
参数:sourceFileName 源文件绝对路径(包含文件名和后缀名)
返回值:实现IPICConvertor接口对象
使用范例:
String sourceFileName = "D:/test/input/a.pdf";
String targetFileDir = "D:/test/output ";
Convert convert = new Convert();
IPICConvertor picc = convert. convertPDFtoPic (sourceFileName);
int resultcode = picc. resultcode();
if(resultcode == 0)
{
picc. converttoPNG(0,2,0.5f,targetFileDir)
}
picc.close();
运行结果,a.pdf文档,其中2页转换成图片,图片比率是0.5。图片存放的目录为D:/test/outputAPI:
int convert (String sourceFileName,String targetFileName)
功能:该接口实现指定通用文档(微软、永中、中文办公)到目标文档(HTML/PDF/UOF/TXT/CSV/图像/EIO)的转换
参数:sourceFileName 源文件绝对路径(包含文件名和后缀名)
targetFileName目标文件绝对路径(包含文件名和后缀名)
返回值:
0-----转换成功
1-----传入的文件,找不到
2-----传入的文件,打开失败
3-----转换过程异常失败
4-----传入的文件有密码
5-----targetFileName的后缀名错误
使用范例:
String sourceFileName = "D:/test/input/a.doc";
String targetFileName = "D:/test/output/a.txt ";
Convert convert = new Convert();
convert. convert (sourceFileName, targetFileName);
运行结果:将D:/test/input/路径下a.doc文件转换为对应的txt文件,存放到D:/test/output文件夹下其他API:
注意:这些接口在调用转换方法之前有效
例如:
String sourceFileName = "D:/test/input/a.doc";
String targetFileName = "D:/test/output/a.txt ";
Convert convert = new Convert();
convert.setAcceptTracks(true);
convert. convert (sourceFileName, targetFileName);
setAcceptTracks文档中设置转换后的文档是否显示修订标记,此方法目前只针对word类型的文档有效
setConvertForPhone
转换后的文档是否适用于手机显示,此方法目前只适用于转换后的html文档
setConvertOneSheet
设置是否只转换第一张工作表,此方法只针对Excel类型的文档有效
setCssOutside
设置用户指定的css文档,此方法只针对ppt类型的文档有效
setEmptyCount
Excel转html的空行转换方法:在转换时,需要对文档中每个单元格的内容进行检查,如果本列中所有单元格都无内容,则继续向后检查,若连续20列没有数据,则20列以后的表格将不需要转换;同时,也需要对单元格中每行的数据进行检测,如果有一行中所有单元格都无内容,继续向后检查,译若连续50行没有数据,则50行以后的表格将不需要转换,此方法只针对Excel类型的文档有效
setFilePermission
设置是否放开转换后的文件权限,针对某些linux系统没有文件的全部访问权限
setFileterHtml
设置转换后的文档是否为筛选后的网页,此方法目前只针对word类型的文档有效
setHtmlEncoding
设置转换后的html文档的编码
setOpenPsw
设置转换时文档的密码,此方法针对有密码的文档有效
setTempPath
文档转换中会产生一些临时文件,此方法可以设置临时文件的存放路径,若不设置,程序会取一个默认路径,如“C:\Documents and Settings\Administrator\Application Data\Yozo_Office”
deleteTempFiles
此方法用于清空临时文件,可在文档转换结束后调用
close
此方法用于清空占用资源
多线程转换:
a) 多线程请使用applicaton.dcs.Convert对象b) 可以用一个Convert池,维护N个convert实例对象,供多线程重复调用(每次new Convert有性能损耗)。
实例代码:
/**
* @(#)ConvertorPool.java, Sep 14, 2009.
*
* Copyright 2009 Yozo, Inc. All rights reserved.
*/
import java.util.ArrayList;
import application.dcs.Convert;
/**
* @author admin
*/
public class ConvertorPool {
private ConvertorPool() {}
private static final ConvertorPool instance = new ConvertorPool();
private ArrayList pool = new ArrayList();
//池内维护了最大为5个实例,可以根据自己的服务器性能调整最大值
private static final int maxSize = 5;
private int availSize = 0;
private int current = 0;
public static ConvertorPool getInstance() {
return instance;
}
//获取池内一个转换实例
public synchronized ConvertorObject getConvertor() {
if (availSize > 0) {
return getIdleConvertor();
} else if (pool.size() < maxSize) {
return createNewConvertor();
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
return getConvertor();
}
}
//使用完成需要还给池内
public synchronized void returnConvertor(ConvertorObject convertor) {
for (ConvertorObject co : pool) {
if (co == convertor) {
co.available = true;
availSize++;
notify();
break;
}
}
}
private synchronized ConvertorObject getIdleConvertor() {
for (ConvertorObject co : pool) {
if (co.available) {
co.available = false;
availSize--;
return co;
}
}
return null;
}
private synchronized ConvertorObject createNewConvertor() {
ConvertorObject co = new ConvertorObject(++current);
co.convertor = new Convert();
co.available = false;
pool.add(co);
return co;
}
//包装convert类,可记录是否在使用中
public class ConvertorObject {
public ConvertorObject(int id) {
this.id = id;
}
public int id;
public Convert convertor;
public boolean available;
}
}
线程内调用代码:
ConvertorObject convertobj = ConvertorPool.getInstance().getConvertor();
convertobj.convertMStoHTML(in, out);
ConvertorPool.getInstance().returnConvertor(convertobj);
资源释放ConvertortPool.getInstance().returnConvertor(convertobj);
JVM的配置:
a) –Xmx设置尽量大b) -XX:ThreadStackSize(windows下需要配置)
c) 举例 1.5G内存机器:
-Xms1024m
-Xmx1024m
-XX:PermSize=128M
-XX:MaxPermSize=256M
-XX:ThreadStackSize=4096
-noverify
d) 参数说明:
-Xmx:java heap最大值,使用的最大内存
-Xms:初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:ThreadStackSize::线程堆栈大小
-noverify:关闭检验bytecode
特殊说明:
第一次调用转换,class类装载,对象需要实例化,因此较慢,第二次调用转换,速度开始正常化。其他问题
常见问题:
需要在目录/usr/X11R6/lib/X11/fonts/TrueType下加入相应的字体文件
需要增加jvm的启动参数, 比如 2G内存机器可以设置以下的内存参数:-Xms512m -Xmx1024m-XX:PermSize=128M -XX:MaxPermSize=256M
No X11 DISPLAY variable was set, but this program performed an operation which requires it. 异常 增加jvm的启动参数: -Djava.awt.headless=true
需要在初始化Convert对象时传入授权文件目录的路径,比如new Convert(“/home/Config”)
请确认是否使用的是试用版本,因为试用版本是有试用时间的
转换过程中会产生一些临时文档,可以通过Convert.setTempPath()方法设置临时目录的地址,或者转换后调用Convert.deleteTempPath()方法清除这些临时文件
支持,并发数一般是cpu核数的1-2倍,可以用对象池去管理Convert对象。我们接口文档介绍中有关于对象池的例子