【问题标题】:Print an escape code to a printer with PS (postscript) file使用 PS(postscript)文件将转义码打印到打印机
【发布时间】:2013-01-17 05:02:41
【问题描述】:

我正在处理可以接受作为普通文本打印的转义码(即打印机命令)的打印机。

例如,如果我创建一个纯文本文件并写入“~TR%10 10 20 20?”然后打印这个,打印机将其识别为命令,并且不会在纸上打印那段文本。

当我尝试通过 postscript 文件(使用 PS module 从 PHP 创建)执行此操作时,我无法让打印机识别与命令相同的文本。而是打印在纸上。

我可以使用 PS 命令/格式来确保将这段文本按原样发送到打印机吗?

谢谢

更新:我也尝试使用 PDF 文件(使用 PHP + TCPDF),但也没有运气。

更新 2:添加示例代码

$ps = ps_new();

ps_open_file($ps, '/var/www/data/test.ps');

ps_set_info($ps, 'BoundingBox', '0 0 1011 638');
ps_set_info($ps, 'Orientation', 'Landscape');
ps_set_info($ps, "Creator", "PHP");
ps_set_info($ps, "Title", "Test");
ps_set_info($ps, "Keywords", "test");

ps_begin_page($ps, 1011, 638);
ps_set_parameter($ps, 'SearchPath', '/var/www/data/font');
$psfont = ps_findfont($ps, "ARIALN_0", "", 1); // Arial Narrow font
ps_setfont($ps, $psfont, 10.0);

ps_show_xy($ps, "ABC", 10, 10);
ps_show_xy($ps, "~TR%41 4 53 11?", 10, 50);

ps_end_page($ps);
ps_close($ps);
ps_delete($ps);

header('Content-type: application/postscript');
header('Content-Disposition: attachment; filename="test.ps"');

readfile('/var/www/data/test.ps');

【问题讨论】:

  • 你能举一个PHP代码例子来说明你做了什么吗?
  • @hek2mgl 使用示例 php 代码编辑
  • 可以分享一下字体进行测试吗?
  • 这是什么打印机,转义码是什么?

标签: php pdf postscript


【解决方案1】:

好吧,我对 PHP 一无所知,但您肯定不想使用ps_show_x_y。这无疑映射到 postscript show 运算符,其工作是在打印页面上显示文本。

从文档看来,ps_include_file 是您想要的方法。 直接将其写入文件,绕过所有 ps_module 内容。正如肯所说,如果您希望打印机识别它,它应该在任何其他后记代码之前。特别是,它需要在幻数“%!”之前。打印机用来检测 postscript 程序并进入相应模式的。

当然,这样做会使 ps 文件不可移植。 gs,蒸馏器,其他打印机,他们都不会愿意接受这个作为后记文档。

正如乔治在评论中提到的那样,无论此控制代码可能做什么(您尚未披露),也可以通过 postscript 方面获得。要做的是找到打印机的 PPD 文件(Postscript 打印机定义)。此文件包含 postscript sn-ps 以执行特定于打印机的任务。它配备了繁重的 DSC cmets 和看似奇怪的格式,使其能够被程序解析,但所有这些都应该可以很容易地找到你需要的 sn-p,假设它实际上是可用的。

【讨论】:

  • 不错的答案!尽管您还假设打印机确实直接接受 Postscript,但 O.P. 并未断言。因为它是文件可能通过操作系统。打印机驱动程序堆栈并被转换为打印机的光栅序列。如果是这种情况,唯一的解决方法是将控制代码发送到打印机在打印之前,绕过操作系统驱动程序堆栈(否则,它将在另一个打印作业中)
  • 这可能由于各种原因不可行,但通常有一种方法可以绕过操作系统并“直接”连接到打印机。过去,带有 JetDirect 的 HP 打印机都在端口 9100 IIRC 上监听。你可以telnet printer 9100 < doc.ps。甚至telnet printer 9100<enter>executive<enter><enter>.
  • 这是打印机的用户手册。 User manual
  • 在第 192 页,您可以看到转义码的一些示例。正如一些屏幕截图所示,这些转义码只是写在文档中的文本。此外,第 199 页的提示和提示部分建议不要使用任何字符格式。可能这就是 PDF/PS 的问题所在。关于如何抑制所有格式并仅使用 PDF 或 PS 打印纯文本的任何想法?
  • 嗯,不。据我所知,这甚至没有意义。一旦打印机处于 PS/PDF 模式,它就不会为自己的代码扫描相同的流。你确定这东西接受附言吗?我没有看到任何关于将这些转义信息破解为 ps 文档的内容。您可以打印到文件以查看驱动程序输出是什么。我敢打赌它是某种 PCL,但不是 PS。您需要将这些转义符破解为任何 格式。
【解决方案2】:

我看不出这有什么办法。当您的打印机不解释 PostScript 时,它可能能够处理随机转义字符,但一旦您进入 PostScript 解释器,它肯定不能这样做。

这是因为它完全有可能在 PostScript 程序的主体中包含二进制数据(与您的转义字符匹配)。如果打印机输入处理程序改为处理该数据,则 PostScript 将无法工作。

所以你需要在 PostScript 解释器启动之前向打印机发送转义码,或者在它完成之后,你不能在中间发送它。

【讨论】:

  • 如果您查看您的打印机文档可能实现特定的后记命令来执行您正在尝试执行的任何操作。
  • @George 您可以在 cmets 中使用 * markdown-emphasis *,但不能使用 html。 :(
猜你喜欢
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多