a

Câu hỏi In tệp PDF hiện có (hoặc các tệp khác) trong C #


Từ một ứng dụng tôi đang xây dựng, tôi cần in các tệp PDF hiện có (được tạo bởi ứng dụng khác). Làm thế nào tôi có thể làm điều này trong C # và cung cấp một cơ chế để người dùng có thể chọn một máy in khác hoặc các thuộc tính khác.

Tôi đã nhìn vào PrintDialog nhưng không chắc chắn những gì nó đang cố gắng để in tập tin, nếu có, b / c đầu ra luôn luôn là một trang trống. Có lẽ tôi chỉ thiếu một cái gì đó ở đó.

Tôi có cần sử dụng "iTextSharp" (như được đề xuất ở nơi khác) không? Điều đó có vẻ kỳ lạ với tôi vì tôi có thể "gửi tập tin đến máy in" Tôi chỉ không có bất kỳ hộp thoại đẹp trước khi tay để thiết lập máy in vv và tôi không thực sự muốn viết một hộp thoại in từ mặt đất lên nhưng có vẻ như rất nhiều ví dụ tôi tìm thấy bằng cách tìm kiếm đã làm điều đó.

Bất kỳ lời khuyên, ví dụ hoặc mã mẫu sẽ là tuyệt vời!

Ngoài ra nếu PDF là vấn đề các tập tin có thể được tạo ra bởi các ứng dụng khác trong một định dạng khác như bitmap hoặc png nếu điều đó làm cho mọi thứ dễ dàng hơn.


23
2017-11-07 21:21


gốc


Bất cứ ai ở đây biết làm thế nào để in các tập tin ngẫu nhiên, không chỉ pdf? Tobi - Tobias
@Tobias: Các tệp ngẫu nhiên được liên kết với các ứng dụng ngẫu nhiên. Thậm chí .doc có thể được kết hợp với WordPad, Word hoặc OpenOffice. Mỗi ứng dụng sẽ có hiển thị của riêng nó. Do đó, cách tiếp cận hữu ích duy nhất là cái gì đó thúc đẩy các liên kết tệp của Windows cho các kiểu tệp có liên quan. - Ruben Bartelink
Câu hỏi liên quan: stackoverflow.com/questions/11579624/… - yms


Các câu trả lời:


Hiển thị một hộp thoại nhỏ với hộp tổ hợp có các mục được đặt thành bộ sưu tập chuỗi được trả về bởi PrinterSettings.InstalledPrinters.

Nếu bạn có thể làm cho nó một yêu cầu GSView được cài đặt trên máy, sau đó bạn có thể in PDF một cách âm thầm. Đó là một chút chậm chạp và vòng xoay nhưng ít nhất bạn không phải bật lên Acrobat.

Dưới đây là một số mã tôi sử dụng để in ra một số tệp PDF mà tôi nhận được từ một dịch vụ Web của 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);
        }
    }

Như bạn có thể thấy, nó lấy dữ liệu PDF dưới dạng một mảng byte, ghi nó vào một tệp tạm thời, và khởi chạy gsprint.exe để in tệp âm thầm đến máy in có tên ("HP Laserjet 5M"). Bạn có thể thay thế tên máy in bằng bất cứ điều gì người dùng đã chọn trong hộp thoại của bạn.

In ấn một PNG hoặc GIF sẽ dễ dàng hơn nhiều - chỉ cần mở rộng lớp PrintDocument và sử dụng hộp thoại in thông thường do Windows Forms cung cấp.

Chúc may mắn!


23
2017-11-07 21:40



Điều này đã giúp tôi rất nhiều. Tôi có một ứng dụng web mạng nội bộ có yêu cầu in tài liệu tới máy in mạng không cần giám sát. Tất cả các phương pháp khác đã thất bại, nhưng phương pháp này hoạt động! - Aaron


Mặc dù đây là VB bạn có thể dễ dàng dịch nó. Bằng cách Adobe không bật lên, nó chỉ in pdf và sau đó biến mất.

''' <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

2
2017-11-07 22:18



Sumatra PDF cũng có dòng lệnh in im lặng args nếu gsview không phải là điều của bạn. blog.kowalczyk.info/software/sumatrapdf/manual.html - jimueller
@jimueller Sumatra PDF hoạt động rất tốt. Cảm ơn rất nhiều.:) - embarus
Có lẽ Adobe đã in một lúc nhiều màu nhưng không còn nữa. Downvoting vì điều này! - HK1


Bạn sẽ cần Acrobat hoặc một số ứng dụng khác có thể in tệp PDF. Từ đó bạn P / Gọi ShellExecute để in tài liệu.


1
2017-11-07 21:31



Bạn có thể vượt qua lựa chọn máy in và các thông số khác với cuộc gọi đó không? - Aaron Fischer


Bạn cũng có thể sử dụng PDFsharp - đó là thư viện nguồn mở để tạo và thao tác các tệp PDF. http://www.pdfsharp.net/


1
2017-11-04 16:50



Lưu ý rằng PDFSharp sử dụng Adobe Reader để in. In ấn im lặng với Adobe Reader không được hỗ trợ bởi Adobe và một chút hacky. Các tác giả thậm chí còn lưu ý điều này trong nguồn. pdfsharp.codeplex.com/SourceControl/changeset/view/51421#707803 - jimueller


Tôi đang làm điều tương tự cho dự án của tôi và nó làm việc cho tôi

Xem liệu nó có thể giúp bạn ...

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 */ 
}

Bạn cũng có thể chơi với các tùy chọn cửa sổ khác nhau

Lệnh IN để có được đầu ra mong muốn ...Liên kết tham khảo


1
2018-06-21 04:09





Sau nhiều nghiên cứu và googling về nhiệm vụ này Microsoft đã phát hành một KB tuyệt vời để in một pdf mà không cần bất kỳ ứng dụng nào khác cần thiết. Không cần phải gọi adobe hoặc ghostprint. Nó có thể in mà không lưu một tập tin vào đĩa làm cho cuộc sống trở nên rất dễ dàng.

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


1
2018-02-27 21:58



Nó hoạt động trên một số máy in. Máy in cần có khả năng tự xử lý các tệp PDF. Nếu không, tệp PDF sẽ in như thể nó là một tệp văn bản. - Jeff Cuscutis