【问题标题】:Creating post script to select printing trays for different pages创建后期脚本以选择不同页面的打印托盘
【发布时间】:2014-03-08 03:53:08
【问题描述】:

我有一个生成 PDF 文件的应用程序。我想实现这一点:某些页面将使用普通纸打印(存在于特定的打印机托盘中),而其他页面将使用特殊的不干​​胶纸打印(来自另一个打印机托盘)

如果 PDF 文件本身可以包含这些在打印时读取的信息,它会解决问题,但我认为这是不可能的。

我设法检查了 PDF 并生成了一个包含其规范的文件。这是一些代码:

        sw = New StreamWriter(File.Open(DATOutputFile, FileMode.Create))
        sw.WriteLine("Zustell".PadRight(20, " ") & ZustellPages(0))


        Dim i As Integer
        Dim aux = ""
        For i = 0 To AddressPages.Count - 2
            aux = aux & AddressPages(i) & ","
        Next
        aux = aux & AddressPages(i)
        sw.WriteLine("Adressen".PadRight(20, " ") & aux)

        aux = ""
        For i = 0 To BotenPages.Count - 2
            aux = aux & BotenPages(i) & ","
        Next
        aux = aux & BotenPages(i)
        sw.WriteLine("Botenbezirk".PadRight(20, " ") & aux)

        aux = ""
        For i = 0 To Etiquetas.Count - 2
            aux = aux & Etiquetas(i)(0) & "-" & Etiquetas(i)(1) & ","
        Next
        aux = aux & Etiquetas(i)(0) & "-" & Etiquetas(i)(1)
        sw.WriteLine("Label".PadRight(20, " ") & aux)

        sw.Close()

此位创建一个如下所示的文件:

也就是说,我知道哪些页面包含标签、地址等。在订购打印时,每个页面都指定到不同的打印机托盘。

如何做到这一点?

我可以从 PDF 或在创建 Crystal 报告时创建带有托盘规格的后期脚本文件吗?

编辑:

我从 PDF 创建了一个 PS 文件,在每个页面的规范开头,有这样的内容:

%%Page: 11 72
%%BeginPageSetup
%%PageBoundingBox: 0 0 596 842
%%PageOrientation: Portrait
%%EndPageSetup
%%<!--LARADOCID--xx/10000000/E/0000011-->
<< /MediaPosition 3 /TraySwitch false >> setpagedevice
<< /PageSize [595 842] /ImagingBBox null >> setpagedevice
STARTP

我想在这里插入一些代码来指定用于该页面的托盘,但是我不知道该怎么做。

【问题讨论】:

    标签: vb.net pdf printing postscript


    【解决方案1】:

    我正在尝试解决一个类似的问题,我需要在不同的托盘上打印每一页。 postscript 文件创建由两部分组成,第一部分由要打印的程序创建,无需任何打印机特定命令,另一部分是 postscript 驱动程序添加有关托盘选择、页面大小等所有信息的部分。 我能够在不同的托盘上打印,在每台打印机上指定正确的命令 惠普

    %%PageTrailer
    %%Page: 2 2
    %%PageBoundingBox: 0 0 595 842
    %%BeginPageSetup
    /pagesave save def
    21 0 obj
    <</Type/Page/MediaBox [0 0 595 842]
    /Parent 3 0 R
    /Resources<</ProcSet[/PDF]
    /Font 23 0 R
    >>
    /Contents 22 0 R
    /CropBox 
    [0 0 594.0 842.0]
    >>
    <</ManualFeed false /MediaPosition 0>> setpagedevice  <-- just add this 
    endobj
    %%EndPageSetup
    22 0 obj
    <</Length 922>>stream
    

    在 Lexmark 上,我添加了类似 currentpagedevice /InputAttributes get 0 get setpagedevice 我刚刚做了一些反向工程。随着打印机停止,我在打印机 C:\Windows\System32\spool\PRINTERS 更改托盘输出产生的 ps 版本之间做了一些差异

    【讨论】:

    • 我以前的公司有这个任务,我现在不能测试这个(我也不想:))。谢谢你的回答江户,我相信它会对其他人有用
    【解决方案2】:

    您可以尝试为您的 PDF 文件创建作业单,但这取决于您的打印机是否能够读取 PJTF(可以嵌入到 PDF 文件中)并对其执行操作。

    您是否可以在转换为 PostScript 时执行此操作取决于您用于将 PDF 转换为 PostScript 的软件,答案是“可能不会”。

    您最好的选择可能是转换为符合 DSC 的 PostScript 文件,然后对 PostScript 进行后处理并在每个页面的页面设置中注入托盘选择。符合 DSC 的文件的结构使得可以相对容易地找到这些部分。

    当然,您需要知道您的打印机所需的纸盘选择 PostScript 序列。

    【讨论】:

    • 是的,我仍在试图弄清楚如何实现这一点,现在我正在考虑在创建后将代码插入到 postscript 文件中。不过,我不熟悉 PJTF 或 DSC 兼容的 PS 文件。至于软件,我没有使用任何东西,我打开 PDF 并执行File -&gt; Print 选择带有 PS 驱动程序的打印机,print to file 并创建我的 PS 文件 - 有没有更好的方法来做到这一点?
    • 有很多方法可以做到这一点。你得到哪一个取决于你使用的操作系统。假设 Windows,则 PostScript 输出(或多或少)符合 DSC。您可能必须从文档级别删除设置,并且必须在页面级别设置中插入适当的选择运算符。可以查找相关的cmets(cmets start with '%' DSC cmets begin '%%')
    • MediaPosition 和 TraySwitch 看起来像是您需要更改的参数。
    • 这就是我的想法,但我无法测试它:它是为客户服务的,他们必须在他们的打印机上进行测试,这并不容易。也许在接下来的几天里,这将成为可能。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 2015-11-30
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    相关资源
    最近更新 更多