Printing to a pdf printer programmatically

前端 未结 11 1182
慢半拍i
慢半拍i 2021-01-06 15:40

I am trying to print an existing file to PDF programmatically in Visual Basic 2008.

Our current relevant assets are: Visual Studio 2008 Professional Adobe Acrobat Pr

相关标签:
11条回答
  • 2021-01-06 16:14

    Best library for Java is iText, but from the last year or so watching the mailing list it is NOT a simple task at all

    0 讨论(0)
  • 2021-01-06 16:16

    If you are trying to hand generated the PDF (with and SDK or a PDF printer driver) it's not very easy. The PDF format reference is available from Adobe.

    The problem is that the file is a mix of ASCII and tables that have binary offsets within the file to reference objects. It is an interesting format, and very extensible, but it is difficult to write a simple file.

    It's doable if you need to. I looked at the examples in the Adobe PDF reference, hand typed them in and worked them over till I could get them to work as I needed. If you will be doing this a lot it might be worth it, otherwise look at an SDK.

    0 讨论(0)
  • 2021-01-06 16:18

    Try using ShellExecute with the Print Verb.

    Here is a blog I found with Google.

    http://www.vbforums.com/showthread.php?t=508684

    0 讨论(0)
  • 2021-01-06 16:18

    Similar to other answers, but much simpler. I finally got it down to 4 lines of code, no external libraries (although you must have Adobe Acrobat installed and configured as Default for PDF).

        Dim psi As New ProcessStartInfo
        psi.FileName = "C:\Users\User\file_to_print.pdf"
        psi.Verb = "print"
        Process.Start(psi)
    

    This will open the file, print it with default settings and then close.

    Adapted from this C# answer

    0 讨论(0)
  • 2021-01-06 16:22

    The big takeaway point here is that PDF IS HARD. If there is anything you can do to avoid creating or editing PDF documents directly, I strongly advise that you do so. It sounds like what you actually want is a batch SNP to PDF converter. You can probably do this with an off-the-shelf product, without even opening Visual Studio at all. Somebody mentioned Adobe Distiller Server -- check your docs for Acrobat, I know it comes with basic Distiller, and you may be able to set up Distiller to run in a similar mode, where it watches Directory A and spits out PDF versions of any files that show up in Directory B.

    An alternative: since you're working with Access snapshots, you might be better off writing a VBA script that iterates through all the SNPs in a directory and prints them to the installed PDF printer.

    ETA: if you need to specify the output of the PDF printer, that might be harder. I'd suggest having the PDF distiller configured to output to a temp directory, so you can print one, move the result, then print another, and so on.

    0 讨论(0)
  • 2021-01-06 16:24

    This is how I do it in VBScript. Might not be very useful for you but might get you started. You need to have a PDF maker (adobe acrobat) as a printer named "Adobe PDF".

    'PDF_WILDCARD = "*.pdf"
    'PrnName = "Adobe PDF"
    Sub PrintToPDF(ReportName As String, TempPath As String, _
                   OutputName As String, OutputDir As String, _
                   Optional RPTOrientation As Integer = 1)
    
      Dim rpt As Report
      Dim NewFileName As String, TempFileName As String
    
      '--- Printer Set Up ---
      DoCmd.OpenReport ReportName, View:=acViewPreview, WindowMode:=acHidden
      Set rpt = Reports(ReportName)
      Set rpt.Printer = Application.Printers(PrnName)
    
      'Set up orientation
      If RPTOrientation = 1 Then
        rpt.Printer.Orientation = acPRORPortrait
      Else
        rpt.Printer.Orientation = acPRORLandscape
      End If
    
      '--- Print ---
      'Print (open) and close the actual report without saving changes
      DoCmd.OpenReport ReportName, View:=acViewNormal, WindowMode:=acHidden
    
      ' Wait until file is fully created
      Call waitForFile(TempPath, ReportName & PDF_EXT)
    
      'DoCmd.Close acReport, ReportName, acSaveNo
      DoCmd.Close acReport, ReportName
    
      TempFileName = TempPath & ReportName & PDF_EXT 'default pdf file name
      NewFileName = OutputDir & OutputName & PDF_EXT 'new file name
    
      'Trap errors caused by COM interface
      On Error GoTo Err_File
      FileCopy TempFileName, NewFileName
    
      'Delete all PDFs in the TempPath
      '(which is why you should assign it to a pdf directory)
      On Error GoTo Err_File
      Kill TempPath & PDF_WILDCARD
    
    Exit_pdfTest:
      Set rpt = Nothing
      Exit Sub
    
    Err_File:    ' Error-handling routine while copying file
      Select Case Err.Number    ' Evaluate error number.
          Case 53, 70   ' "Permission denied" and "File Not Found" msgs
              ' Wait 3 seconds.
              Debug.Print "Error " & Err.Number & ": " & Err.Description & vbCr & "Please wait a few seconds and click OK", vbInformation, "Copy File Command"
              Call sleep(2, False)
              Resume
          Case Else
              MsgBox Err.Number & ": " & Err.Description
              Resume Exit_pdfTest
      End Select
    
      Resume
    
    End Sub
    
    
    
    Sub waitForFile(ByVal pathName As String, ByVal tempfile As String)
        With Application.FileSearch
            .NewSearch
            .LookIn = pathName
            .SearchSubFolders = True
            .filename = tempfile
            .MatchTextExactly = True
            '.FileType = msoFileTypeAllFiles
        End With
        Do While True
           With Application.FileSearch
               If .Execute() > 0 Then
                   Exit Do
               End If
           End With
        Loop
    End Sub
    
    
    
    Public Sub sleep(seconds As Single, EventEnable As Boolean)
        On Error GoTo errSleep
        Dim oldTimer As Single
    
        oldTimer = Timer
        Do While (Timer - oldTimer) < seconds
           If EventEnable Then DoEvents
        Loop
    
    errSleep:
           Err.Clear
    End Sub
    
    0 讨论(0)
提交回复
热议问题