PostScript/PCL - 获取文档页面信息:页面大小,bw/color

PostScript/PCL - Get document page info: page size, bw/color

我需要从 post 脚本或 pcl 文件中确定文档页面信息。最好在 Java,但 Ghostscript/Ghostpcl 也可以。

我试图获取以下信息:

页面颜色

This can be achieved with ghostscript/ghostpcl using the device called inkcov.

PostScript
gswin64c.exe -dNOPAUSE -dBATCH -sDEVICE=inkcov -o- input.ps

PCL6
gpcl6win64 -dNOPAUSE -dBATCH -sDEVICE=inkcov -o- input.pcl

页面大小

There is a device called bbox which gives me the boundary box per page for PostScript or PCL6 documents

PostScript
gswin64c.exe -dNOPAUSE -dBATCH -sDEVICE=bbox -o- input.ps

PCL6
gpcl6win64 -dNOPAUSE -dBATCH -sDEVICE=bbox -o- input.pcl

但最后边界框是页面大小的不准确近似值。 我检查了以下 post,但该解决方案似乎不适用于我的 ghostscript 9.5 版 Getting the page sizes of a PostScript document

bbox 设备应该提供准确的信息,它在哪些方面不准确?我会自己测试,但你没有提供文件来证明这一点。

您需要记住,某些对象(例如图像)可能会将页面标记为白色 space。出于 bbox 设备的目的,这仍然算作标记页面。如果您只想计算非白色输出样本,则需要渲染文档(以您打算使用的最终分辨率)并实际计算非白色像素。这可能是一个非常慢的操作,因为它需要读取可能是非常大的图像的每个输出颜色样本。

虽然编码并不难,但您可以使用 inkcov 设备作为基础,在同一个通道中执行这两个操作。

或者您可以让 GhostPDL 为您提供渲染的位图,并使用其他 tool/language.

编写边界框的解决方案

啊,您实际上是在寻找请求的媒体尺寸,而不是边界框吗?那根本不是一回事。边界框 returns 包围输出上所有标记的最小矩形,它不会告诉您请求的媒体有多大。所以左下角的一个小矩形会给你一个小的 BBox,即使媒体很大。

您可以通过编写一个小的 PostScript 程序相当轻松地从 PostScript 获取媒体大小请求,但您不能使用 PCL 做到这一点。在这两种情况下,最简单的解决方案可能是将内容呈现为 72 dpi 的文件,然后读取呈现输出的 width/heiight 并为您提供以磅为单位的媒体大小。

或使用 pdfwrite 设备将输入转换为 PDF,然后 pdf_info.ps PostScript 程序可用于为您提供 PDF 文件的页面大小。

的确,我正在寻找请求的媒体大小,而不是边界框。 也许我应该更具体一些。 这里有一些 ascii 艺术来点亮你的一天。

y
^
|
|
+-----------+
| +----+    |
| |bbox|    |
| +----+    |
|           |
|           |
|           |
|           |
|           |
+-----------+----> x

A simple document with some text in the upper left corner.

KenS: "The bounding box returns the smallest rectangle which encloses all the marks on the output, it doesn't tell you how big the requested media was."

所以目前 "easiest" 解决方案实际上是将 ps/pcl 文件转换为 pdf 并从那里读取媒体大小。

转换为 PDF

PostScript
gswin64c.exe -dBATCH -dNOPAUSE -dNOOUTERSAVE -sDEVICE=pdfwrite -sOutputFile=output.pdf input.ps

PCL6
gpcl6win64 -dBATCH -dNOPAUSE -dNOOUTERSAVE -sDEVICE=pdfwrite -sOutputFile=output.pdf input.pcl