Печать на PDF-принтер программно - PullRequest
2 голосов
/ 02 октября 2008

Я пытаюсь распечатать существующий файл в PDF программным способом в Visual Basic 2008.

Наши текущие соответствующие активы: Visual Studio 2008 Professional Adobe Acrobat Professional 8.0

Я думал о том, чтобы получить SDK, такой как ITextSharp, но это кажется излишним из-за того, что я пытаюсь сделать, тем более что у нас есть полная версия Adobe.

Есть ли относительно простой фрагмент кода для печати на PDF-принтере (и, конечно, назначить его для печати в определенном месте) или для печати в pdf потребуется использование другой библиотеки?


Я хочу напечатать ранее созданный документ в файл PDF. В данном случае это файл .snp, который я хочу преобразовать в файл .pdf, но я думаю, что логика будет одинаковой для любого типа файла.


Я только что попробовал выполнить вышеописанную оболочку, и она не будет работать так, как я хочу. поскольку он подсказывает мне, где я хочу печатать, и по-прежнему не печатает, где я хочу (в нескольких местах), что очень важно, поскольку мы создаем много файлов PDF с одинаковыми именами (с различными данными в PDF и помещенными в соответствующие клиентские папки)


Текущий процесс:

  • Перейдите на \\ сервер отчетов \ client1
  • Создание PDF-файлов всех документов snp в папке вручную
  • скопировать pdf в \\ отчеты сайта \ client1
  • , а затем повторить для всех 100+ клиентов. На завершение и проверку

Я знаю, что это можно сделать лучше, но я был здесь только три месяца, и были другие неотложные проблемы, которые были намного более неотложными. Я также не ожидал, что что-то, что выглядит таким тривиальным, будет настолько сложным для кодирования.

Ответы [ 11 ]

3 голосов
/ 09 октября 2008

Важным моментом здесь является то, что PDF труден. Если есть что-то, что вы можете сделать, чтобы избежать создания или редактирования документов PDF напрямую, я настоятельно рекомендую вам это сделать. Похоже, что вы действительно хотите, это пакетный конвертер SNP в PDF. Вероятно, вы можете сделать это с помощью готового продукта, даже не открывая Visual Studio вообще. Кто-то упомянул Adobe Distiller Server - проверьте документы на Acrobat, я знаю, что он поставляется с базовым Distiller, и вы можете настроить Distiller для работы в аналогичном режиме, где он просматривает каталог A и выплевывает PDF-версии любых файлов. которые отображаются в каталоге B.

Альтернативный вариант: поскольку вы работаете со снимками Access, вам может быть лучше написать сценарий VBA, который перебирает все SNP в каталоге и печатает их на установленном PDF-принтере.

ETA: если вам нужно указать выходные данные принтера PDF, это может быть сложнее. Я бы предложил настроить дистиллятор PDF для вывода во временный каталог, чтобы вы могли распечатать один, переместить результат, затем напечатать другой и т. Д.

3 голосов
/ 03 октября 2008

Вот как я это делаю в VBScript. Может быть не очень полезно для вас, но может помочь вам начать. В качестве принтера вам необходимо иметь создатель PDF (Adobe Acrobat) с именем «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
1 голос
/ 17 ноября 2010

У меня была такая же проблема. Решением, которое я сделал, было приобретение компонента PDFTron. Он имеет API для отправки документов в формате PDF на принтер из автоматической службы. Я разместил некоторую информацию в своем блоге об этом. Взгляни!

Как напечатать файл PDF программно ???

1 голос
/ 02 октября 2008

PDFforge предлагает PDFCreator. Он будет создавать PDF-файлы из любой программы, которая может печатать, даже существующие программы. Обратите внимание, что он основан на GhostScript, поэтому, возможно, он не очень подходит для вашей лицензии Acrobat.

Вы смотрели на Adobe Distiller Server ? Вы можете создавать файлы PostScript с помощью любого драйвера принтера и переводить его в PDF. (На самом деле, PDFCreator делает то же самое.)

1 голос
/ 02 октября 2008

Что вы хотите сделать, это найти хороший бесплатный драйвер PDF Printer. Они устанавливаются как принтеры, но вместо печати на физическом устройстве команды принтера отображаются в формате PDF. Затем вы можете либо ShellExecute, как указано выше, либо использовать встроенный .net PrintDocument, ссылаясь на «принтер» PDF по имени. Я нашел пару бесплатных , включая продукты из Primo и BullZip (свобода ограничена 10 пользователями) довольно быстро.

Похоже, что файлы SNP являются снимками Microsoft Access. Вам нужно будет найти интерфейс командной строки для доступа или для просмотра снимков, который позволит вам указать место назначения принтера.

Я также увидел, что в загрузку SnapshotViewer включен элемент ActiveX. Вы можете попробовать использовать это в своей программе для загрузки файла snp, а затем указать, куда его печатать, если он поддерживает эту функцию.

0 голосов
/ 26 июня 2017

Аналогично другим ответам, но гораздо проще. Наконец-то я сократил его до 4 строк кода, без внешних библиотек (хотя у вас должен быть установлен Adobe Acrobat и настроен как «По умолчанию для PDF»).

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

Это откроет файл, распечатает его с настройками по умолчанию, а затем закроет.

Адаптировано из этого ответа C #

0 голосов
/ 10 февраля 2016
Imports System.Drawing.Printing
Imports System.Reflection
Imports System.Runtime.InteropServices
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim pkInstalledPrinters As String

    ' Find all printers installed
    For Each pkInstalledPrinters In _
        PrinterSettings.InstalledPrinters
        printList.Items.Add(pkInstalledPrinters)
    Next pkInstalledPrinters

    ' Set the combo to the first printer in the list
    If printList.Items.Count > 0 Then
        printList.SelectedItem = 0
    End If
    End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Try

        Dim pathToExecutable As String = "AcroRd32.exe"
        Dim sReport = " " 'pdf file that you want to print
        'Dim SPrinter = "HP9F77AW (HP Officejet 7610 series)" 'Name Of printer
        Dim SPrinter As String
        SPrinter = printList.SelectedItem
        'MessageBox.Show(SPrinter)
        Dim starter As New ProcessStartInfo(pathToExecutable, "/t """ + sReport + """ """ + SPrinter + """")
        Dim Process As New Process()
        Process.StartInfo = starter
        Process.Start()
        Process.WaitForExit(10000)
        Process.Kill()
        Process.Close()
    Catch ex As Exception
        MessageBox.Show(ex.Message) 'just in case if something goes wrong then we can suppress the programm and investigate
    End Try
End Sub
End Class
0 голосов
/ 28 июля 2010

Лучшая библиотека для Java - это iText, но с прошлого года или около того, просматривая список рассылки, это НЕ простая задача вообще

0 голосов
/ 10 октября 2008

Я столкнулся с подобной проблемой в приложении C # ASP.NET. Моим решением было запустить компилятор LaTeX в командной строке с некоторым сгенерированным кодом. Это не совсем простое решение, но оно генерирует действительно красивые файлы .pdf.

0 голосов
/ 02 октября 2008

Если вы пытаетесь вручную сгенерировать PDF (с помощью и SDK или драйвера принтера PDF), это не очень легко. Ссылка на формат PDF доступна в Adobe.

Проблема в том, что файл представляет собой смесь ASCII и таблиц, которые имеют двоичные смещения в файле для ссылки на объекты. Это интересный формат и очень расширяемый, но сложно написать простой файл.

Это выполнимо, если вам нужно. Я просмотрел примеры в справочнике по Adobe PDF, набрал их вручную и работал над ними, пока не смог заставить их работать так, как мне нужно. Если вы будете делать это много, это может стоить того, иначе посмотрите на SDK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...