2008-11-07 4 views
23

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

Я посмотрел на PrintDialog, но не уверен, какой файл он пытается распечатать, если есть, b/c вывод всегда пустой. Может быть, я просто что-то пропустил.

Нужно ли использовать «iTextSharp» (как предложено еще где)? Мне кажется странным, так как я могу «отправить файл на принтер». У меня просто нет хорошего диалога перед установкой принтера и т. Д., И я действительно не хочу писать диалог печати с нуля но, похоже, многие примеры, которые я нашел, искали именно так.

Любые советы, примеры или примеры кода были бы замечательными!

Также, если PDF является проблемой, файлы могут быть созданы другим приложением в формате diff, таком как bitmap или png, если это упростит ситуацию.

+0

Любой, кто знает, как печатать случайные файлы, а не только файлы PDF? Tobi – Tobias 2009-06-19 13:55:59

+3

@Tobias: Случайные файлы связаны со случайными приложениями. Даже .doc может быть связан с WordPad, Word или OpenOffice. Каждое приложение будет иметь собственный рендеринг. Поэтому единственным полезным подходом является то, что использует ассоциации файлов Windows для задействованных типов файлов. – 2011-02-13 21:29:31

+0

Связанный вопрос: http://stackoverflow.com/questions/11579624/how-to-print-a-pdf-with-c-sharp – yms 2013-03-22 16:15:34

ответ

1

Вам понадобится Acrobat или другое приложение, которое может распечатать PDF. Оттуда вы выполните P/Invoke до ShellExecute, чтобы распечатать документ.

+1

Можете ли вы передать выбор принтера и другие параметры с помощью этого вызова? – 2008-11-07 21:48:33

23

Показать небольшое диалоговое окно со списком, в котором его элементы установлены в коллекцию строк, возвращаемую PrinterSettings.InstalledPrinters.

Если вы можете сделать это требование, чтобы на машине было установлено GSView, вы можете затем тихо распечатать PDF-файл. Это немного медленно и круто, но по крайней мере вам не нужно всплывать Acrobat.

Вот код, я использую, чтобы напечатать некоторые PDF-файлы, которые я получаю обратно с веб-UPS службы:

private void PrintFormPdfData(byte[] formPdfData) 
    { 
     string tempFile; 

     tempFile = Path.GetTempFileName(); 

     using (FileStream fs = new FileStream(tempFile, FileMode.Create)) 
     { 
      fs.Write(formPdfData, 0, formPdfData.Length); 
      fs.Flush(); 
     } 

     try 
     { 
      string gsArguments; 
      string gsLocation; 
      ProcessStartInfo gsProcessInfo; 
      Process gsProcess; 

      gsArguments = string.Format("-grey -noquery -printer \"HP LaserJet 5M\" \"{0}\"", tempFile); 
      gsLocation = @"C:\Program Files\Ghostgum\gsview\gsprint.exe"; 

      gsProcessInfo = new ProcessStartInfo(); 
      gsProcessInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      gsProcessInfo.FileName = gsLocation; 
      gsProcessInfo.Arguments = gsArguments; 

      gsProcess = Process.Start(gsProcessInfo); 
      gsProcess.WaitForExit(); 
     } 
     finally 
     { 
      File.Delete(tempFile); 
     } 
    } 

Как вы можете видеть, он принимает данные PDF как массив байтов, записывает его в temp file, и запускает gsprint.exe, чтобы печатать файл тихо на именованный принтер («HP Laserjet 5M»). Вы можете заменить имя принтера тем, что пользователь выбрал в вашем диалоговом окне.

Печать PNG или GIF будет намного проще - просто расширить класс PrintDocument и использовать обычный диалог печати, предоставляемый Windows Forms.

Удачи вам!

+0

Это очень помогло мне. У меня есть веб-приложение для интрасети, в котором есть необходимость печатать документы на сетевом принтере без присмотра. Все другие методы потерпели неудачу, но это работает! – Aaron 2011-11-01 20:36:33

2

Хотя это VB, вы можете легко перевести его. Кстати, Adobe не всплывает, она печатает только PDF, а затем уходит.

''' <summary> 
''' Start Adobe Process to print document 
''' </summary> 
''' <param name="p"></param> 
''' <remarks></remarks> 
Private Function printDoc(ByVal p As PrintObj) As PrintObj 
    Dim myProcess As New Process() 
    Dim myProcessStartInfo As New ProcessStartInfo(adobePath) 
    Dim errMsg As String = String.Empty 
    Dim outFile As String = String.Empty 
    myProcessStartInfo.UseShellExecute = False 
    myProcessStartInfo.RedirectStandardOutput = True 
    myProcessStartInfo.RedirectStandardError = True 

    Try 

     If canIprintFile(p.sourceFolder & p.sourceFileName) Then 
      isAdobeRunning(p)'Make sure Adobe is not running; wait till it's done 
      Try 
       myProcessStartInfo.Arguments = " /t " & """" & p.sourceFolder & p.sourceFileName & """" & " " & """" & p.destination & """" 
       myProcess.StartInfo = myProcessStartInfo 
       myProcess.Start() 
       myProcess.CloseMainWindow() 
       isAdobeRunning(p) 
       myProcess.Dispose() 
      Catch ex As Exception 
      End Try 
      p.result = "OK" 
     Else 
      p.result = "The file that the Document Printer is tryng to print is missing." 
      sendMailNotification("The file that the Document Printer is tryng to print" & vbCrLf & _ 
      "is missing. The file in question is: " & vbCrLf & _ 
      p.sourceFolder & p.sourceFileName, p) 
     End If 
    Catch ex As Exception 
     p.result = ex.Message 
     sendMailNotification(ex.Message, p) 
    Finally 
     myProcess.Dispose() 
    End Try 
    Return p 
End Function 
+0

Sumatra PDF также имеет тихую команду командной строки, если gsview не ваша вещь. http://blog.kowalczyk.info/software/sumatrapdf/manual.html – jimueller 2011-03-19 17:04:42

1

Вы также можете использовать PDFsharp - это библиотека с открытым исходным кодом для создания и обработки PDF-файлов. http://www.pdfsharp.net/

0

Я делаю то же самое для моего проекта, и она работала для меня

Смотрите, если это может помочь ...

Process p = new Process(); 
p.EnableRaisingEvents = true; //Important line of code 
p.StartInfo = new ProcessStartInfo() 
{ 
    CreateNoWindow = true, 
    Verb = "print", 
    FileName = file, 
    Arguments = "/d:"+printDialog1.PrinterSettings.PrinterName 
}; 
try 
{ 
    p.Start(); 
} 
catch 
{ 
    /* your fallback code */ 
} 

Вы также можете играть с различными вариантами окон

Команда PRINT для получения желаемого результата ...Reference link

2

После долгих исследований и поиска по этой проблеме Microsoft выпустила большой КБ для печати pdf без каких-либо других необходимых приложений. Не нужно вызывать adobe или ghostprint. Он может печатать без сохранения файла на диск, что облегчает жизнь.

http://support2.microsoft.com/?kbid=322091

 Смежные вопросы

  • Нет связанных вопросов^_^