Распечатать существующий PDF (или другие файлы) в C#
Из приложения, которое я создаю, мне нужно распечатать существующие PDF-файлы (созданные другим приложением). Как я могу сделать это в C# и предоставить механизм, чтобы пользователь мог выбрать другой принтер или другие свойства.
Я посмотрел на PrintDialog, но не уверен, какой файл он пытается напечатать, если таковые имеются, b / c вывод всегда пустая страница. Может быть, я просто что-то там упускаю
Нужно ли использовать "iTextSharp" (как предложено еще где)? Мне это кажется странным, так как я могу "отправить файл на принтер". У меня просто нет какого-то красивого диалога, чтобы настроить принтер и т. Д., И я не хочу писать диалог печати с нуля. но, похоже, множество примеров, которые я нашел при поиске, сделали именно это.
Любые советы, примеры или примеры кода будут отличными!
Также, если проблема заключается в PDF, файлы могут быть созданы другим приложением в формате diff, таком как растровое изображение или png, если это облегчает задачу.
6 ответов
Покажите небольшое диалоговое окно с комбинированным списком, в котором его Предметы установлены в коллекцию строк, возвращаемую 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 в виде байтового массива, записывает их во временный файл и запускает gsprint.exe для автоматической печати файла на указанном принтере ("HP Laserjet 5M"). Вы можете заменить имя принтера тем, которое выберет пользователь в диалоговом окне.
Печать в формате PNG или GIF будет намного проще - просто расширьте класс PrintDocument и используйте обычный диалог печати, предоставляемый Windows Forms.
Удачи!
Хотя это 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
Вам понадобится Acrobat или другое приложение, которое может распечатать PDF. Оттуда вы P/Invoke в ShellExecute для печати документа.
Я делаю то же самое для своего проекта, и он работал для меня
Посмотрите, может ли это помочь вам...
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 для получения желаемого результата... Ссылка
Вы также можете использовать PDFsharp - это библиотека с открытым исходным кодом для создания и управления PDF-файлами. http://www.pdfsharp.net/
После долгих исследований и поисков в этой задаче Microsoft выпустила отличную КБ для печати PDF без каких-либо других приложений. Не нужно называть Adobe или Ghostprint. Он может печатать без сохранения файла на диск, что делает жизнь очень простой.