Update 03012013 Ive schrieb einen nachfolgenden Beitrag, der auf der Arbeit dieses Originalpostens aufbaut. Der neue Beitrag stellt diese Funktionalität über einen WCF-Service zur Verfügung und findet sich hier. Making PDFs aus HTML Ich wollte über einen Ansatz Ive entdeckt für die Herstellung von PDFs direkt aus HTML zu sprechen. Ich weiß, dass in diesen wilden und verrückten Tagen von PDF. js und dergleichen, dass Techniken wie diese muss sehr alten Hut erscheinen. Das heißt, diese Technik funktioniert und noch wichtiger ist es ein Problem, mit dem ich konfrontiert wurde, aber ohne die Benutzer zu zwingen, die neueste heißeste Version von X zu bewegen. Viel wie viele würden gerne Probleme auf diese Weise lösen, leider viele Unternehmen bewegen sich langsamer als das Und in der Zwischenzeit müssen wir noch liefern - wir müssen noch die Anforderungen erfüllen. Anstatt nur zu sagen, dass ich das tat, dachte ich, dass ich auf den Punkt gekommen bin. Ich weiß nicht über dich, aber ich finde die Begründung, warum verschiedene technische Entscheidungen ein ganz interessantes Thema gemacht haben. Seit einiger Zeit entwickelte ich die Unterstützung einer Anwendung, die in einer Intranet-Umgebung verwendet wird, in der das Unternehmen den Browser noch IE 6 beauftragt hat. Es war eine Voraussetzung dafür, dass es in dieser Anwendung Druckfunktionalität gibt. Wie bekannt ist (auch von Microsoft selbst) war die Druckfunktionalität im IE 6 niemals fantastisch. Aber die Voraussetzung für nutzbare Ausdrucke blieb. Die Entwickler, die an dem System arbeiten, beschlossen, Crystal Reports zu nutzen (erinnern Sie sich daran). Im Wesentlichen gab es eine Berichtskomponente für die Anwendung zu der Zeit, die benutzerdefinierte Berichte mit Crystal erstellt und sie an den Benutzer in Form von PDFs (die seitdem hervorragend bedruckbar sind, so lange wie ich mich erinnern kann). Einer der Entwickler, die an dem System arbeiten, erkannte, dass es perfekt möglich wäre, einige Berichte in Crystal zu erstellen, die wirklich auf PDF-Bildschirme für die App gedruckt wurden. Es funktionierte gut und diese Lösung blieb für eine sehr lange Zeit in Platz. Doch einige Jahre unten die Linie der Crystal Reports wurde als der Reporting-Mechanismus für die App verworfen. Aber wir konnten Crystal nicht ganz abschaffen, weil wir es noch zum Druck benötigten. Id nie wirklich mochte die Crystal-Lösung für eine Reihe von Gründen: Wir brauchten benutzerdefinierte gespeicherte Procs, um die Crystal Print-Bildschirme, die in der Nähe Duplikate der wichtigsten App-Procs waren zu fahren. Diese Verdoppelung der Anstrengung fühlte sich nie richtig an. Wir mussten IDEs wechseln, wann immer wir unsere Druckbildschirme pflegten. Und die Crystal IDE ist keine Freude zu bedienen. Vielleicht am wichtigsten, für bestimmte Benutzer mussten wir Bits von Informationen aus dem Druck zu verstecken. Die Version von Crystal, die wir benutzten, machte nicht die dynamische Anpassung unserer Druckbildschirme ein einfacher Vorschlag. (In seiner Verteidigung wir werent wirklich verwenden es für das, was es für entworfen wurde.) Als Ergebnis der Entwickler vor mir hatte am Ende der Schaffung von verschiedenen Versionen von jedem Print-Bildschirm mit verschiedenen Ebenen der Informationen. Wie Sie sich vorstellen können, bedeutete dies, dass der Aufwand bei der Veränderung der Druckbildschirme exponentiell angestiegen war. Es fiel mir ein, dass es gut wäre, wenn wir einen Weg finden könnten, unsere eigenen PDF-Berichte zu erstellen, ohne Crystal zu benutzen, das wäre ein Schritt Vorwärts. Es war kurz danach, dass ich auf WKHTMLtoPDF passiert bin. Dies ist ein Open-Source-Projekt, das sich als ein einfaches Shell-Programm beschreibt, um HTML zu pdf mit dem Webkit-Rendering-Engine und qt zu konvertieren. Ich habe es auf verschiedenen Webseiten getestet und es hat gearbeitet. Es war nicht durch jede Strecke der Phantasie ein perfektes HTML zu PDF-Tool, aber die Qualität, die es produziert stark übertroffen die Präsentation derzeit über Crystal. Das war nur das Ticket. Mit WKHTMLtoPDF könnte ich einfache Web-Seiten in der Anwendung, die in WKHTMLtoPDF geleitet werden könnte, um ein PDF nach Bedarf zu machen. Es könnte dynamisch sein - weil ASP dynamisch ist. Wir brauchen nicht, um benutzerdefinierte gespeicherte Procs zu schreiben und zu pflegen. Und glücklicherweise müssten wir nicht mehr Crystal benutzen. Bevor wir uns von Crystal befreien konnten, brauchte ich einen Weg, dass ich diese PDFs auf der Webseite innerhalb der Website generieren konnte. Dafür habe ich am Ende eine einfache Wrapper-Klasse für WKHTMLtoPDF geschrieben, die verwendet werden könnte, um es auf der Fliege aufzurufen. In der Tat wurde ein guter Teil davon aus verschiedenen Beiträgen auf einem Post auf StackOverflow abgeleitet. Es landete so aus: Mit diesem Wrapper konnte ich URLs passieren und PDFs extrahieren. Heres ein paar Beispiele von mir genau das tun: Wie Sie aus dem zweiten Beispiel oben sehen können, ist es möglich, eine Anzahl von URLs in den Wrapper zu platzieren, die alle zu einem einzigen PDF übertragen werden sollen. Die meiste Zeit war dies für unsere Anforderungen überschüssig, aber es ist gut, das zu wissen. Werfen Sie einen Blick auf die BBC-Website PDF generiert durch das erste Beispiel: Ziemlich gut, nein Wie Sie sehen können, ist es nicht perfekt aus der Betrachtung der Titel (Bit zerquetscht), aber ich habe bewusst eine kompliziertere Seite gezeigt, um zu zeigen, was WKHTMLtoPDF in der Lage war. Die Druckmasken, die ich mir vorstellen musste, wäre wesentlich einfacher als dies. Sobald dies an Ort und Stelle war, konnte ich die Kristalllösung abschaben. Es wurde durch ein paar Druck auf PDF ASPXs in der Haupt-Web-App ersetzt, die beim Rendern angepasst werden würde, um die relevanten Datenbits vom Benutzer zu verbergen. Diese ASPXs würden in die HtmlToPdf-Methode nach Bedarf geleitet und dann würde der Benutzer zu diesem PDF umgeleitet werden. Wenn aus irgendeinem Grund die PDF-Datei nicht in die Lage versetzt wurde, den Benutzer den direkten Druck auf PDF ASPX zu sehen - einfach nicht als PDF, wenn du siehst, was ich meine. Ich sollte sagen, dass es ziemlich selten für eine PDF-Datei nicht machen, aber das war mein Failsafe. Diese neue Lösung hatte aus unserer Perspektive eine Reihe von Aufwärtsbewegungen: Die Entwicklungswartungszeit (und damit die Kosten für unsere Kunden) für Druckbildschirme wurde deutlich reduziert. Dies war aufgrund der Druckbildschirme, die Teil der Haupt-Web-App sind. Dies bedeutete, dass sie Styling etc. mit allen anderen Web-Bildschirmen und die dynamische Natur von ASP machte Customizing ein Bildschirm auf der Fliege Einfachheit selbst. Wir konnten nun unsere Druckbildschirme für die Benutzer in gleicher Weise wie in unserer Web-Web-App regionalisieren. Dies war einfach nicht realistisch mit der Crystal-Lösung wegen der Menge an Arbeit beteiligt. Ich denke, das ist eine Art TROCKENE Lösung :-) Sie können den obigen Ansatz ganz einfach nutzen. Alles was Sie tun müssen, ist herunterzuladen und installieren Sie WKHTMLtoPDF auf Ihrem Computer. Ich rate mit der Version 0.9.9, da die späteren Release-Kandidaten derzeit etwas Buggy erscheinen. Paar von Gotchas: Stellen Sie sicher, dass Sie den richtigen Installationspfad an die HtmlToPdf-Methode übergeben, wenn Sie ihn irgendwo anders als den Standardstandort installiert haben. Youll sehen, dass die Klasse den Default übernimmt, wenn es nicht bestanden hat. Sicherstellen, dass Lese - und Ausführungsrechte dem wkhtmltopdf-Ordner für den entsprechenden Prozess gewährt werden. Stellen Sie sicher, dass Schreibrechte für den Speicherort, den Sie Ihre PDFs für den relevanten Prozess erstellen möchten, in unserer Situation gewährt wird Wir rufen das direkt in unserer Web-Applikation auf Anfrage an. Ich habe keine Ahnung, wie das skalieren würde - vielleicht nicht gut. Dies ist nicht wirklich ein Problem für uns als unsere Benutzerbasis ist ziemlich klein und diese Funktionalität wird nicht übermäßig genannt. Ich denke, wenn dies viel mehr verwendet wurde, als es Id ist, versucht zu werden, diese Funktionalität in eine separate App zu verlassen. Aber das funktioniert jetzt nur dandy. Process. WaitForExit-Methode () WaitForExit () macht den aktuellen Thread so lange warten, bis der zugehörige Prozess beendet wird. Es sollte angerufen werden, nachdem alle anderen Methoden auf den Prozess aufgerufen sind. Um das Spalten des aktuellen Threads zu vermeiden, verwenden Sie das Exited-Ereignis. Diese Methode weist die Prozesskomponente an, eine unendliche Zeit zu warten, bis die Prozess - und Ereignisbehandlungsroutinen beendet werden. Dies kann dazu führen, dass eine Anwendung nicht mehr reagiert. Wenn Sie zum Beispiel CloseMainWindow für einen Prozess anrufen, der über eine Benutzeroberfläche verfügt, wird die Anforderung an das Betriebssystem, den zugehörigen Prozess zu beenden, möglicherweise nicht behandelt, wenn der Prozess geschrieben wird, um seine Nachrichtenschleife niemals einzugeben. In den Framework 3.5 und früheren Versionen wartete die WaitForExit () Überlastung auf MaxValue Millisekunden (ca. 24 Tage), nicht auf unbestimmte Zeit. Auch die vorherigen Versionen warteten nicht, bis die Event-Handler beendet wurden, wenn die volle MaxValue-Zeit erreicht wurde. Diese Überlastung stellt sicher, dass alle Bearbeitungen abgeschlossen sind, einschließlich der Handhabung von asynchronen Ereignissen für umgeleiteten Standardausgang. Sie sollten diese Überladung nach einem Aufruf der WaitForExit (Int32) Überlast verwenden, wenn die Standardausgabe an asynchrone Ereignishandler umgeleitet wurde. Wenn ein zugehöriger Prozess beendet wird (dh, wenn er durch das Operationssystem durch eine normale oder abnormale Beendigung heruntergefahren wird), speichert das System Verwaltungsinformationen über den Prozess und kehrt zu der Komponente zurück, die WaitForExit () aufgerufen hat. Die Prozesskomponente kann dann auf die Informationen zugreifen, die die ExitTime enthalten. Indem du den Handle zum beendeten Prozess benutzt. Da der zugehörige Prozess beendet ist, weist die Handle-Eigenschaft der Komponente nicht mehr auf eine bestehende Prozessressource hin. Stattdessen kann der Handgriff nur verwendet werden, um auf die Betriebssysteme Informationen über die Prozessressource zuzugreifen. Das System ist sich bewusst von Handles zu ausgehenden Prozessen, die nicht von Prozesskomponenten freigegeben wurden, so dass es die ExitTime - und Handle-Informationen im Speicher hält, bis die Process-Komponente die Ressourcen speziell freigibt. Aus diesem Grund rufen Sie, wenn Sie den Start für eine Process-Instanz aufrufen, an, wenn der zugehörige Prozess beendet ist und Sie keine Verwaltungsinformationen mehr benötigen. Schließen beendet den Speicher, der dem ausgegebenen Prozess zugeordnet ist.
No comments:
Post a Comment