为 Documents4j 的 RemoteConverter 自定义 HttpClient
Custom HttpClient for RemoteConverter of Documents4j
我正在使用来自 jBoss Web 应用程序的 RemoteConverter
到构建为默认 server-standalone
包含在 documents4j 项目中的独立服务器。
在 jboss 我有一个旧版本的必需库 httpclient-4.0.1.jar
和相关的 httpcore-4.0.1.jar
所以我面临着很多 ClassDefNotFoundException
造成的JVM 加载的不同版本的 jar。
HttpClientConnectionManager
对象存在一个特定问题,该对象在版本
中尚不可用
为了避免这个问题,我想为 standalone-server
构建一个自定义的 http 客户端,因为由于之前的问题,我无法使用 Jersey
。
是否有人为此 standalone-server
构建了不同的客户端?构建自定义 RemoteClient
的规格是什么?
更新 1
在嗅探工具的帮助下进行了一些分析后,我弄清楚了消息的组成,所以我刚刚结束了该服务器的自定义 HttpClient
,如下所示:
File wordFile = new File("C:/temp/test.docx");
InputStream targetStream = new FileInputStream(wordFile);
URL url = new URL("http://localhost:9998");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/vnd.com.documents4j.any-msword");
conn.setRequestProperty("Accept", "application/pdf");
conn.setRequestProperty("Converter-Job-Priority", "1000");
OutputStream os = conn.getOutputStream();
os.write(IOUtils.toByteArray(targetStream));
os.flush();
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
FileWriter ostream = new FileWriter("C:/temp/test.pdf");
BufferedWriter out = new BufferedWriter(ostream);
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
out.write(output+"\n");
}
br.close();
out.close();
os.close();
conn.disconnect();
现在我遇到了另一个问题,如果我尝试打开刚创建的 test.pdf 文件,它全是白色的,但页数正确。如果我用文本编辑器打开文件并分析文件的开头和结尾,我发现以下字符:
%PDF-1.5
%µµµµ
1 0 obj
[...]
startxref
1484122
%%EOF
这似乎是一个不错的 PDF 文件。
从 REST 服务器接收到的文件还有其他用途吗?
在回答您的问题之前:我建议您先 shade 依赖然后重新实现它。
我可以想象您在实现自己的服务时遇到了编码问题。 BufferedReader
将传入数据转换为字符数据。不要按字符行读取数据,而是将其视为二进制。使用 Stream 类 而不是 Writer 类。这就是为什么元数据被正确处理,因为它由字符表示,但实际数据是非法的,因为它是二进制信息:
InputStream in = conn.getInputStream();
OutputStream out = new FileOutputStream("C:/temp/test.pdf");
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
我正在使用来自 jBoss Web 应用程序的 RemoteConverter
到构建为默认 server-standalone
包含在 documents4j 项目中的独立服务器。
在 jboss 我有一个旧版本的必需库 httpclient-4.0.1.jar
和相关的 httpcore-4.0.1.jar
所以我面临着很多 ClassDefNotFoundException
造成的JVM 加载的不同版本的 jar。
HttpClientConnectionManager
对象存在一个特定问题,该对象在版本
为了避免这个问题,我想为 standalone-server
构建一个自定义的 http 客户端,因为由于之前的问题,我无法使用 Jersey
。
是否有人为此 standalone-server
构建了不同的客户端?构建自定义 RemoteClient
的规格是什么?
更新 1
在嗅探工具的帮助下进行了一些分析后,我弄清楚了消息的组成,所以我刚刚结束了该服务器的自定义 HttpClient
,如下所示:
File wordFile = new File("C:/temp/test.docx");
InputStream targetStream = new FileInputStream(wordFile);
URL url = new URL("http://localhost:9998");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/vnd.com.documents4j.any-msword");
conn.setRequestProperty("Accept", "application/pdf");
conn.setRequestProperty("Converter-Job-Priority", "1000");
OutputStream os = conn.getOutputStream();
os.write(IOUtils.toByteArray(targetStream));
os.flush();
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
FileWriter ostream = new FileWriter("C:/temp/test.pdf");
BufferedWriter out = new BufferedWriter(ostream);
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
out.write(output+"\n");
}
br.close();
out.close();
os.close();
conn.disconnect();
现在我遇到了另一个问题,如果我尝试打开刚创建的 test.pdf 文件,它全是白色的,但页数正确。如果我用文本编辑器打开文件并分析文件的开头和结尾,我发现以下字符:
%PDF-1.5
%µµµµ
1 0 obj
[...]
startxref
1484122
%%EOF
这似乎是一个不错的 PDF 文件。
从 REST 服务器接收到的文件还有其他用途吗?
在回答您的问题之前:我建议您先 shade 依赖然后重新实现它。
我可以想象您在实现自己的服务时遇到了编码问题。 BufferedReader
将传入数据转换为字符数据。不要按字符行读取数据,而是将其视为二进制。使用 Stream 类 而不是 Writer 类。这就是为什么元数据被正确处理,因为它由字符表示,但实际数据是非法的,因为它是二进制信息:
InputStream in = conn.getInputStream();
OutputStream out = new FileOutputStream("C:/temp/test.pdf");
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}