当fop数据较大时,Java应用程序无法正确运行外部jar(FOP)

时间:2014-12-03 11:15:11

标签: java pdf apache-fop

我在从Java程序运行FOP时遇到问题。 我使用Java 1.8_25。

运行命令:

String[] cmd4 = {"java", "-jar", rootDir+"build"+ FileSeparator +"fop.jar", "-c", rootDir+"lib" + FileSeparator + "conf" + FileSeparator + "myfop.xconf", pathToFOP.getCanonicalPath(), outputFile.getCanonicalPath()};
System.out.println(Arrays.toString(cmd4));
Process p = Runtime.getRuntime().exec(cmd4);
p.waitFor();
java.io.InputStream is=p.getInputStream();
byte b[]=new byte[is.available()];
is.read(b,0,b.length);
System.out.println(new String(b));

当我在程序中生成相对较短的输出时,FOP正常进行并生成.pdf文件。

当我生成更大的输出(但仍在一个A4页面上)时,FOP进程执行,创建空的.pdf文件并等待。当我杀死主程序时,FOP正确地保存了.pdf。但是我希望在主程序运行时转换.pdf文件(它也会在打开后生成.pdf文件)

未显示错误

程序输出:

[java,-jar,C:\ JForm \ build \ fop.jar,-c,C:\ JForm \ lib \ conf \ myfop.xconf,C:\ Users \ Phoros \ Documents \ test29x.pdf.fop ,C:\ Users \ Phoros \ Documents \ test29x.pdf]

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

一旦输出不再适合单个缓冲区,在Java中读取外部进程的输出就不那么容易了。然后你必须创建一个单独的线程来读取输出,否则进程不能写更多,只会阻塞并永远不会完成(这就是你所看到的)。

您可以修复它,但由于FOP是一个Java库,因此在没有外部过程的情况下直接调用Java API应该更容易。

另一个想法是涉及外部进程放置其结果的临时文件。那样,过程'直接输出不会很大。


更多评论:

java.io.InputStream is=p.getInputStream();
byte b[]=new byte[is.available()];
is.read(b,0,b.length);

我认为这也无法可靠地发挥作用。 available不一定包含所有数据,只需在阻止获取更多数据之前指出有多少数据。

是否有必要将整个内容读入内存?

System.out.println(new String(b));

为什么要将字节转换成字符串只是为了再次打印它们?你不能直接打印字节吗?