Jak wydrukować dokument HTML z usługi sieci Web?

głosy
68

Chcę wydrukować HTML z C # usługi internetowej. Kontrola przeglądarka jest przesadą, i nie działa dobrze w środowisku usług, ani nie działają dobrze na systemie z bardzo ciasnych ograniczeń bezpieczeństwa. Czy istnieje jakiś rodzaj wolnej .NETbiblioteki, która będzie obsługiwać drukowanie podstawowej strony HTML? Oto kod mam tak daleko, który nie działa poprawnie.

public void PrintThing(string document)
{
    if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
    {
        Thread thread =
            new Thread((ThreadStart) delegate { PrintDocument(document); });
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
    }
    else
    {
        PrintDocument(document);
    }
}

protected void PrintDocument(string document)
{
    WebBrowser browser = new WebBrowser();
    browser.DocumentText = document;
    while (browser.ReadyState != WebBrowserReadyState.Complete)
    {
        Application.DoEvents();
    }
    browser.Print();
}

Działa to dobrze, gdy wywołana z UI typu wątków, ale nic się nie dzieje, gdy wywołana z wątku usługa typu. Zmiana Print()na ShowPrintPreviewDialog()plony następujący błąd skryptu IE:

Błąd: 'dialogArguments .___ IE_PrintType' jest null lub nie jest obiektem
URL: res: //ieframe.dll/preview.dlg

I pojawia się pusta dialogowe podgląd wydruku.

Utwórz 01/08/2008 o 19:33
źródło użytkownik
W innych językach...                            


7 odpowiedzi

głosy
29

Można drukować z wiersza poleceń przy użyciu następujących:

rundll32.exe% WINDIR% \ System32 \ mshtml.dll, PrintHTML "% 1"

Gdzie% 1 jest ścieżka do pliku z pliku html do wydrukowania.

Jeśli nie trzeba wydrukować z pamięci (lub może sobie pozwolić, aby napisać do dysku w pliku temp) można użyć:

using (Process printProcess = new Process())
{
    string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
    printProcess.StartInfo.FileName = systemPath + @"\rundll32.exe";
    printProcess.StartInfo.Arguments = systemPath + @"\mshtml.dll,PrintHTML """ + fileToPrint + @"""";
    printProcess.Start();
}

Uwaga ta działa tylko w systemach Windows 2000 i powyżej myślę.

Odpowiedział 03/08/2008 o 19:06
źródło użytkownik

głosy
3

Łatwo! Podzielić problem na dwóch prostych elementów:

  1. renderowania HTML do PDF
  2. wydrukować PDF ( SumatraPDF )
  • -print-to-default $file.pdf drukuje plik PDF na drukarkę domyślną
  • -print-to $printer_name $file.pdf drukuje PDF na danej drukarce
Odpowiedział 15/08/2012 o 14:27
źródło użytkownik

głosy
3

Jeśli masz go w budżecie (~ $ 3000), sprawdź PrinceXML .

Będzie to uczynić HTML do formatu PDF, dobrze funkcjonuje w środowisku usług i obsługuje zaawansowane funkcje, takie jak nie łamanie strony w środku komórki tabeli (co wiele przeglądarek nie obsługuje obecnie).

Odpowiedział 12/04/2010 o 18:57
źródło użytkownik

głosy
3

Wiem, że sama wizualna (wersja co najmniej 2003) Studio odwołuje IE dll bezpośrednio do renderowania „Widok projektu”.

może warto patrząc na to.

W przeciwnym razie, nie mogę myśleć o niczym poza kontrolą przeglądarki internetowej.

Odpowiedział 02/08/2008 o 01:42
źródło użytkownik

głosy
0

Mam narzędzie, które działa bardzo dobrze dla mnie jest HiQPdf. https://www.hiqpdf.com/

Cena jest rozsądna (zaczyna się od $ 245) i może to uczynić HTML do formatu PDF, a także zarządzać drukowanie plików PDF bezpośrednio.

Odpowiedział 08/09/2019 o 05:35
źródło użytkownik

głosy
0

Może to pomoże. http://www.codeproject.com/KB/printing/printhml.aspx Również nie jestem pewien, co gwint próbujesz uzyskać dostęp do przeglądarki z kontroli, ale musi być STA

Uwaga - Projekt, o którym mowa w linku nie pozwalają, aby przejść do strony i wykonać wydruk bez pokazywania okna drukowania.

Odpowiedział 17/06/2009 o 18:36
źródło użytkownik

głosy
-1

Nie znam konkretnych narzędzi, ale istnieją pewne narzędzia, które nagrywanie / odtwarzanie kliknięć. Innymi słowy, można zautomatyzować „kliknięcie” w oknie dialogowym drukowania. (Wiem, że jest to hack, ale gdy wszystko inne zawiedzie ...)

Odpowiedział 20/09/2008 o 18:37
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more