如何从PS文件创建PDF,同时减少页面和4页到一页(4上)?

时间:2015-11-05 15:14:34

标签: vb.net ghostscript

打印路径为:

  1. Excel或VB.net PrintDocument>
  2. 后记>
  3. 使用GhostScript的多个PS文件到单个PDF>
  4. 使用iTextPDF添加印记>
  5. 使用用于双面打印/装订等的自定义PJL命令从PDF创建特定打印机的PCL文件。
  6. 使用LPR将PCL文件发送到打印机
  7. 在步骤3中,是否可以从PS文件创建PDF(使用GhostScript),同时减少页面并使用4页(4页)?或2到一页(2上)?

    4 up表示缩小4页以适合一张纸:

    enter image description here

        'This uses a list of PS files to create one PDF
        Private Shared Sub ConvertToPDF(ByVal PSPathFileList As List(Of String), _
                                 ByVal PDFPathName As String, _
                                 ByVal WaitForExit As Boolean, ByVal DeletePS As Boolean)
    
            'check that all files exist
            PSPathFileList.ForEach(AddressOf CheckFiles)
    
            'check old pdf file
            If IO.File.Exists(PDFPathName) Then
                Throw New ApplicationException( _
                    "PDF cannot be created. File already exists: " & PDFPathName)
            End If
    
            'convert engine
            Dim myProcInfo As New ProcessStartInfo
            myProcInfo.FileName = DanBSolutionsLocation & "Misc\GhostScript\GSWIN32C.EXE"
            Debug.Print(myProcInfo.FileName)
    
            'write file names to text file as the list can be very long
            Dim tempPath As String = IO.Path.GetDirectoryName(PSPathFileList.Item(0))
            Dim fiName2 As String = tempPath & IO.Path.GetFileNameWithoutExtension(PDFPathName) & ".txt"
    
            Dim ft As New StreamWriter(fiName2)
            ft.WriteLine("-sDEVICE=pdfwrite -q -dSAFER -dNOPAUSE -sOUTPUTFILE=""" & PDFPathName & """ -dBATCH ")
            For i As Long = 0 To PSPathFileList.Count - 1
                ft.WriteLine(Chr(34) & PSPathFileList.Item(i) & Chr(34))
            Next
            ft.Close()
    
            'set args to text file
            myProcInfo.Arguments = """@" & fiName2 & """"
    
            'set up for output and errors
            myProcInfo.UseShellExecute = False
            myProcInfo.RedirectStandardOutput = True
            myProcInfo.RedirectStandardError = True
            Debug.Print(myProcInfo.Arguments)
    
            'do the conversion
            Dim myProc As Process = Process.Start(myProcInfo)
    
            Debug.Print(myProc.StandardOutput.ReadToEnd)
            Debug.Print(myProc.StandardError.ReadToEnd)
    
            If WaitForExit Then
                'wait for finish; (no more than 60 seconds)
                myProc.WaitForExit(60000)
    
                'delete PS
                If DeletePS Then
                    PSPathFileList.ForEach(AddressOf DeleteFiles)
                End If
            End If
    
        End Sub
    

1 个答案:

答案 0 :(得分:1)

是的,它可以拍摄带有'N'页的PostScript文件并生成带有'M'页的单个PDF文件,其中每个页面都有原始页面的N / M,缩小和偏移。

这称为拼版,有商业工具可以做到这一点,或者你可以使用psnup。

或者你也可以编写PostScript来自己完成这项工作(毕竟PostScript是一种编程语言)。可能最简单的方法是自定义BeginPage例程。

此例程应检查页数,并使用它来确定将虚拟页面绘制到哪个象限。这意味着改变CTM以缩放内容并翻译原点。虽然缩放保持不变,但翻译随每个虚拟页面而变化,以便将其移动到不同的象限。哦,你也需要一个自定义的EndPage,所以只有每4页被发送到输出。

更复杂的实现还会覆盖setpagedevice,以便为每个媒体请求单独设置缩放,以防页面不在同一媒体上。

或者您可以将整个批次提炼成一个PDF文件,然后使用我编写的程序here来完成PDF格式的工作。

当然,由于每种页面描述语言的功能不同,您的多次转换,PS-> PDF-> PCL很可能会导致妥协。我希望这些页面内容非常简单......