Hvordan skriver jeg et HTML-dokument fra en web-tjeneste?

stemmer
69

Jeg ønsker å skrive ut HTML fra en C # webtjeneste. Nettleseren kontroll er overkill, og fungerer ikke godt i en tjeneste miljø, heller ikke fungere godt på et system med svært stramme sikkerhetsbegrensninger. Er det noen form for gratis .NETbibliotek som vil støtte utskrift av en grunnleggende HTML-side? Her er koden jeg har så langt, som ikke kjøre skikkelig.

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

Dette fungerer fint når kalt fra UI-type tråder, men ingenting skjer når de kalles fra en tjeneste-type tråd. Endre Print()til ShowPrintPreviewDialog()avkastning følgende IE script feil:

Feil: 'dialogArguments .___ IE_PrintType' er null eller ikke et objekt
URL: res: //ieframe.dll/preview.dlg

Og en liten tomt dialog forhåndsvisning vises.

Publisert på 01/08/2008 klokken 18:33
kilden bruker
På andre språk...                            


6 svar

stemmer
29

Du kan skrive ut fra kommandolinjen ved hjelp av følgende:

rundll32.exe% windir% \ system32 \ mshtml.dll, PrintHTML "% 1"

Hvor% 1 er filen banen av HTML-filen som skal skrives ut.

Hvis du ikke trenger å skrive ut fra minnet (eller har råd til å skrive til disken i en midlertidig fil) som du kan bruke:

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 Dette fungerer bare på Windows 2000 og nyere tror jeg.

Svarte 03/08/2008 kl. 18:06
kilden bruker

stemmer
4

Lett! Dele problemet i to enklere deler:

  1. gjengi HTML til PDF
  2. skrive ut PDF ( SumatraPDF )
  • -print-to-default $file.pdf skriver ut en PDF-fil på en standardskriver
  • -print-to $printer_name $file.pdf skriver ut en PDF-fil på en gitt skriver
Svarte 15/08/2012 kl. 13:27
kilden bruker

stemmer
4

Jeg vet at Visual Studio selv (i hvert fall i 2003-versjonen) viser til IE dll direkte å gjengi "Design View".

Det kan være verdt å se inn i den.

Hvis ikke, jeg kan ikke tenke på noe utover nettleser kontroll.

Svarte 02/08/2008 kl. 00:42
kilden bruker

stemmer
3

Hvis du har det i budsjettet (~ $ 3000), sjekk ut PrinceXML .

Det vil gjengi HTML i en PDF, fungerer godt i en servicemiljø, og støtter avanserte funksjoner som ikke bryte en side i midten av en tabellcelle (som mange nettlesere ikke støtter foreløpig).

Svarte 12/04/2010 kl. 17:57
kilden bruker

stemmer
0

Kanskje dette vil hjelpe. http://www.codeproject.com/KB/printing/printhml.aspx Også ikke sikker på hva tråden du prøver å få tilgang til nettleseren kontroll fra, men det må være STA

Merk - Prosjektet omtales i linken gjør at du kan navigere til en side og utføre en utskrift uten å vise dialogboksen Skriv ut.

Svarte 17/06/2009 kl. 17:36
kilden bruker

stemmer
-1

Jeg vet ikke spesifikke verktøy, men det er noen verktøy som record / replay klikk. Med andre ord, du kan automatisere "klikk" i dialogboksen Skriv ut. (Jeg vet dette er en hack, men når alt annet svikter ...)

Svarte 20/09/2008 kl. 17:37
kilden bruker

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