2008-08-01 25 views
66

Chcę wydrukować HTML z usługi internetowej C#. Kontrola przeglądarki internetowej jest przesadna i nie działa dobrze w środowisku usługowym, ani nie działa dobrze w systemie z bardzo wąskimi ograniczeniami bezpieczeństwa. Czy istnieje jakaś bezpłatna biblioteka .NET, która obsługuje drukowanie podstawowej strony HTML? Oto kod, który mam do tej pory, który nie działa poprawnie.Jak wydrukować dokument HTML z usługi internetowej?

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 poprawnie, gdy jest wywoływane z wątków typu UI, ale nic się nie dzieje po wywołaniu z wątku typu usługi. Zmiana Print() do ShowPrintPreviewDialog() daje następujący błąd skryptu IE:

Error: 'dialogArguments.___IE_PrintType' is null or not an object
URL: res://ieframe.dll/preview.dlg

i pojawia się pusta dialogowe podgląd wydruku.

+0

Proszę wybrać najlepszą odpowiedź, dzięki. – mruanova

+0

@mruanova Żadna z odpowiedzi nie działała na ostatnią próbowałem ich. Jeśli masz coś, co działa, daj nam znać. –

Odpowiedz

3

Wiem, że samo Visual Studio (przynajmniej w wersji 2003) odwołuje się bezpośrednio do biblioteki IE bezpośrednio, aby wyświetlić "Widok projektu".

Warto się nad tym zastanowić.

W przeciwnym razie nie mogę wymyślić niczego poza kontrolą przeglądarki.

28

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 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(); 
} 

nb Działa to tylko w Windows 2000 i wyżej.

+0

Świetna odpowiedź - zamierzał oznaczyć to przyjęcie i przeprowadził mój test. Wydaje się, że biblioteka DLL wciąż wyskakuje w oknie dialogowym Drukuj, a ponieważ ma działać jako nienadzorowana usługa Windows, musimy jakoś ominąć. Mam dość wyczerpania Google'a i jestem na końcu mojego rozumu. –

+0

Niestety pojawia się okno dialogowe drukarki. Testowałem na Windows 7 x64. – LukTar

-1

Nie znam konkretnych narzędzi, ale istnieją narzędzia, które rejestrują/odtwarzają kliknięcia. Innymi słowy, możesz zautomatyzować "kliknięcie" w oknie dialogowym drukowania. (Wiem, że to hack, ale kiedy wszystko inne zawiedzie ...)

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 kontroli z przeglądarki, ale to musi być STA

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

3

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

Wyrenderuje kod HTML do pliku PDF, działa dobrze w środowisku usługowym i obsługuje zaawansowane funkcje, takie jak nie łamanie strony w środku komórki tabeli (której wiele przeglądarek aktualnie nie obsługuje).

3

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

  1. render the HTML to PDF
  2. wydruku PDF (SumatraPDF)
  • -print-to-default $file.pdf prints a PDF file on a default printer
  • -print-to $printer_name $file.pdf prints a PDF on a given printer
+0

Ostatni sprawdziłem, część 2 (drukowanie za pomocą linii poleceń z Adobe) nie działa w usłudze - wymaga interakcji użytkownika. –

+1

Wypróbuj Sumatra PDF jest znacznie szybszy http://blog.kowalczyk.info/software/sumatrapdf/manual.html#manual-cmd-line –

Powiązane problemy