You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:49:59