使用不同的页面设置打印多种文档类型

时间:2017-04-10 18:39:32

标签: excel vb.net printing ms-word tiff

我有一个自动化脚本正在运行,其输出是各种文档类型,并使用各种打印机设置打印这些文档。我打印到所有文档的同一台打印机,这样很好。我有三个需要打印的excel工作表。这些是我使用内置的" PrintOutEx"方法。一张放在一张letter尺寸的纸上,两张放到11x17张。接下来,我让脚本打印一个word文档,我使用内置的" PrintOut"方法。这将打印在11x17纸上,但缩放,以便两页并排打印。最后,我必须打印一个多页的tiff文档,我正在使用打印处理程序进行打印。我有很多问题,如果这些都是愚蠢的问题我会道歉,并感谢我能收集的任何帮助。

  1. 我试图保持默认打印机与启动子程序时的默认打印机相同,并且似乎没有使用PrinterSettings方法。
  2. 关于默认打印机:默认打印机更改为我想要的打印机(最后不会更改)。默认打印机设置为11x17。如果我将打印机的默认设置更改为8.5x11,则所有内容都会打印到8.5x11。
  3. 该脚本似乎忽略了我提供的设置/页面设置/设置。
  4. 单词文档打印未缩放以适合纸张,我尝试将纸张尺寸设置为11x17以及8.5x11并缩放打印,但这看起来非常糟糕。
  5. 第一个Excel工作表无法打印到letter尺寸的纸张。
  6. 第二张和第三张工作表正常工作(只要默认的打印机设置符合要求;请参阅第2点)。
  7. 只要默认打印机的默认设置正确,多页tiff文档就可以打印出来。
  8. 我不是一名专业的程序员,所以如果问题有一个简单的答案或者代码看起来很可怕,我会道歉。我对这个问题进行了很多研究,但却无法找到有效的解决方案。 :(我逐行逐步完成代码,没有错误。我附上了迄今为止的代码。

    感谢!!!

    Public Sub PrintSPIDPackage(SPID As String)
    
        On Error GoTo errHandler
    
        Dim printerSettings As New Printing.PrinterSettings
        Dim curPrinter As String
        Dim engPrinter As String
        Dim purPrinter As String
    
        engPrinter = "engBLAH"
        purPrinter = "purBLAH"
        curPrinter = printerSettings.PrinterName
    
        Dim spidBBPath As String
    
        spidBBPath = ****REDACTED
        spidDrawingPackagePath = ***REDACTED*** 
    
        Dim eAPP As New Excel.Application
        Dim wB As Excel.Workbook
        Dim wS As Excel.Worksheet
        Dim rng As Excel.Range
        Dim lRow As Integer
        Dim wAPP As New Word.Application
        Dim doc As Word.Document
    
        wB = eAPP.Workbooks.Open(spidBBPath)
    
        wS = wB.Worksheets(selectedSheet & " OPs")
        wS.PageSetup.PaperSize = Excel.XlPaperSize.xlPaperLetter 'I would think this causes the printer to printout to a letter size paper
        wS.PrintOutEx(ActivePrinter:=engPrinter)
        wS = wB.Worksheets(selectedSheet)
        lRow = wS.Range("A" & wS.Rows.Count).End(Excel.XlDirection.xlUp).Row + 3
        rng = wS.Range("A1:I" & lRow)
        rng.PrintOutEx(ActivePrinter:=engPrinter) 'PRINT SHOULD BE AN 11x17
        wS = wB.Worksheets(selectedSheet & " MLB")
        wS.PrintOutEx(ActivePrinter:=engPrinter) 'PRINT SHOULD BE AN 11x17
    
        wB.Close(False)
        eAPP.Quit()
        Runtime.InteropServices.Marshal.ReleaseComObject(wS)
        Runtime.InteropServices.Marshal.ReleaseComObject(wB)
        Runtime.InteropServices.Marshal.ReleaseComObject(eAPP)
    
        If InStr(xPath, ".doc") <> 0 Then
            doc = wAPP.Documents.Open(xPath)
            wAPP.ActivePrinter = engPrinter
            doc.PageSetup.PaperSize = Word.WdPaperSize.wdPaperLetter ''''''print out should be 11x17 with two pages side by side
            wAPP.PrintOut(PrintZoomColumn:=2, PrintZoomRow:=1) ', PrintZoomPaperHeight:=2 * (11 * 1440), PrintZoomPaperWidth:=2 * (8.5 * 1440)) '''''AS you see I tried scaling...
            doc.Close(False)
            doc = Nothing
            wAPP.Quit()
            wAPP = Nothing
        End If
    
        Dim pDoc As New Printing.PrintDocument
        currPage = 0
    
        AddHandler pDoc.PrintPage, AddressOf pDocPage
    
        PrintDialog1.Document = pDoc
        pDoc.DefaultPageSettings.Landscape = True
        pDoc.DocumentName = SPID & "-Drawing Package"
        pDoc.PrinterSettings.PrinterName = engPrinter
        pDoc.DefaultPageSettings.Landscape = True
        pDoc.DefaultPageSettings.Margins.Left = 50
        pDoc.DefaultPageSettings.Margins.Right = 50
        pDoc.DefaultPageSettings.Margins.Top = 50
        pDoc.DefaultPageSettings.Margins.Bottom = 50
    
        Dim ps As New Printing.PaperSize("Tabloid", 1700, 1100)
        ps.PaperName = Printing.PaperKind.Tabloid
        pDoc.DefaultPageSettings.PaperSize = ps
        pDoc.Print()
    
        printerSettings.PrinterName = curPrinter 'this should reset the user's default printer to the original setting to before when this routine started??
    
        Exit Sub
    
    errHandler:
        MsgBox(Err.Description)
    
    End Sub
    
    Sub pDocPage(ByVal sender As Object, ByVal e As Printing.PrintPageEventArgs)
    
        Dim img As Image = Image.FromFile(spidDrawingPackagePath)
        Dim pCount = img.GetFrameCount(FrameDimension.Page)
    
        img.SelectActiveFrame(FrameDimension.Page, currPage)
    
        Using stReader As IO.MemoryStream = New IO.MemoryStream
            img.Save(stReader, ImageFormat.Bmp)
            Dim bmp As Bitmap = CType(Image.FromStream(stReader), Bitmap)
            e.Graphics.DrawImage(bmp, 0, 0)
            bmp.Dispose()
        End Using
    
        currPage += 1
    
        If currPage < pCount Then
            e.HasMorePages = True
        End If
    
    End Sub
    

0 个答案:

没有答案