在Java中使用Ghost4J渲染大Post Script文件



我做了一个Java应用程序,目的是为PS文件提供打印预览。

我的程序使用Ghostscript和Ghost4J加载Post Script文件,并使用SimpleRenderer生成图像列表(每个页面一个)。渲染方法。然后使用一个简单的JList,我只显示与用户在JList中选择的页面相对应的图像。

在出现一个非常大的PS文件之前,这会在执行代码

时导致OutOfMemoryError。
PSDocument pdocument = new PSDocument(new File(filename));

我知道使用InputStreams一次读取一点文件是可能的,问题是我无法想到一种方法将我读取的字节与文档的实际页面连接起来。

示例,我尝试一次从PS文件读取100 MB

int buffer_size = 100000000;
byte[] buffer = new byte[buffer_size];
FileInputStream partial = new FileInputStream(filename);
partial.read(buffer, 0, buffer_size);
document.load(new ByteArrayInputStream(buffer));
SimpleRenderer renderer = new SimpleRenderer();
//how many pages do i have to read?
List<Image> images = renderer.render(document, firstpage ??, lastpage ??);

我是否缺少一些Ghost4J功能来读取部分文件?或者有人对如何以不同的方式解决这个问题有其他建议/方法吗?我真的很挣扎

我发现我可以使用Ghost4J Core API从Post Script文件中检索一组减少的页面作为图像。

Ghostscript gs = Ghostscript.getInstance();
String[] gsArgs = new String[9];
gsArgs[0] = "-dQUIET";
gsArgs[1] = "-dNOPAUSE";
gsArgs[2] = "-dBATCH";
gsArgs[3] = "-dSAFER";
gsArgs[4] = "-sDEVICE=display";
gsArgs[5] = "-sDisplayHandle=0";
gsArgs[6] = "-dDisplayFormat=16#804";
gsArgs[7] = "-sPageList="+firstPage+"-"+lastPage;
gsArgs[8] = "-f"+filename;

//create display callback (capture display output pages as images)
ImageWriterDisplayCallback displayCallback = new ImageWriterDisplayCallback();

//set display callback
gs.setDisplayCallback(displayCallback);

//run PostScript (also works with PDF) and exit interpreter
try {

gs.initialize(gsArgs);
gs.exit();
Ghostscript.deleteInstance();

} catch (GhostscriptException e) {
System.out.println("ERROR: " + e.getMessage());
e.printStackTrace();
}
return displayCallback.getImages(); //return List<Images>

这解决了在预览中将页面呈现为图像的问题。

但是,我找不到一种方法来使用Ghost4J来知道PS文件的总页数(如果文件太大而无法使用Document.load()打开它)。

所以,我仍然在这里需要一些帮助

最新更新