0

我需要从 postscript 或 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

但最终边界框是页面大小的不准确近似值。我检查了以下帖子,但该解决方案似乎不适用于我的 ghostscript 9.5 版 获取 PostScript 文档的页面大小

4

2 回答 2

1

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

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

不过,编写代码并不难,您可以使用inkcov 设备作为在同一通道中执行这两项操作的基础。

或者您可以让 GhostPDL 为您提供渲染的位图,并使用其他工具/语言编写边界框的解决方案。

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

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

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

于 2019-11-28T15:16:52.717 回答
0

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

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

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

KenS:“边界框返回包含输出上所有标记的最小矩形,它不会告诉您请求的媒体有多大。”

因此,目前“最简单”的解决方案实际上是将 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
于 2019-12-18T17:27:35.563 回答