如何在Apache XML Graphics Commons的PSDocumentGraphics2D中写入指定setpagedevice命令?
如何在PSDocumentGraphics2D生成的PS文件首尾插入指定PostScript设备命令
我之前用Apache XML Graphics Commons处理PS文件生成时,刚好碰到过类似需求,给你分享下实操可行的实现方案:
核心思路
PSDocumentGraphics2D是基于流输出工作的,我们可以利用这一点,在它开始绘制书籍内容前,直接往输出流里写入开头的PostScript设备命令;等所有内容绘制完成后,再写入结尾的命令。因为PostScript是顺序执行的脚本,这样插入的命令会被解释器正确执行,不会干扰原有内容的渲染。
具体代码实现
假设你已经有了基础的PSDocumentGraphics2D初始化逻辑,只需要在关键节点插入命令即可:
// 1. 准备输出流(这里以文件输出为例) OutputStream out = new FileOutputStream("book_content.ps"); // 2. 初始化PSDocumentGraphics2D实例 PSDocumentGraphics2D g2d = new PSDocumentGraphics2D(false); // 传入页面宽高,根据你的书籍尺寸调整 g2d.setupDocument(out, 612, 792); // ------------------- 写入开头的PostScript设备命令 ------------------- // 直接向输出流写入指定命令,注意换行符保证命令独立 out.write("<<</OutputType(Stacker)>>>setpagedevice\n".getBytes(StandardCharsets.UTF_8)); out.write("<<</EndOfSet true/Jog 3>>>setpagedevice\n".getBytes(StandardCharsets.UTF_8)); // 3. 执行你原本的书籍内容绘制逻辑 g2d.drawString("书籍正文内容...", 100, 150); // ...其他绘制操作(比如图片、段落等)... // 4. 结束当前页面(如果是多页书籍,这里需要循环处理每页) g2d.finishPage(); // ------------------- 写入结尾的PostScript设备命令 ------------------- out.write("<<</OutputType ()>>>setpagedevice\n".getBytes(StandardCharsets.UTF_8)); out.write("<<</EndOfSet false/Jog 0>>>setpagedevice\n".getBytes(StandardCharsets.UTF_8)); // 5. 完成整个文档的生成 g2d.finish(); out.close();
关键注意点
- 命令写入时机:开头命令必须在
setupDocument之后、开始绘制内容之前写入;结尾命令要在finishPage之后、finish之前写入。如果是多页文档,可根据需求选择给每页首尾加命令,或是只给整个文档的首尾加。 - 缓冲流处理:如果使用了
BufferedOutputStream这类带缓冲的流,写入命令后记得调用flush(),确保命令被立即写入流中,避免出现命令顺序错乱的问题。 - 命令格式:每条PostScript命令末尾的
\n很重要,能保证解释器正确识别独立的命令,避免因命令粘连导致语法错误。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

