Sunday 20 August 2017

Waitforexit Wkhtmltopdf C Processo #


Aggiornamento 03012013 Ive ha scritto un post successivo, che si basa sul lavoro di questo post originale. Il nuovo post espone questa funzionalità tramite un servizio WCF e può essere trovato qui. Fare i PDF da HTML ho voluto parlare di un approccio Ive ha scoperto per fare PDF direttamente da HTML. Mi rendo conto che in questi giorni selvaggi e folli di pdf. js e simili che le tecniche di questo tipo devono sembrare molto vecchio cappello. Detto questo, questa tecnica funziona e cosa più importante, risolve un problema mi trovai di fronte, ma senza costringere gli utenti a muoversi la nuova versione più calda di X. Per quanto molti dei vorrebbero risolvere i problemi in questo modo, purtroppo molte aziende si muovono più lentamente di quello e nel frattempo abbiamo ancora consegnare - dobbiamo ancora fare fronte alle richieste. Piuttosto che limitarsi a dire che ho fatto questo ho pensato di registro come sono arrivato a questo punto, in primo luogo. Non so voi, ma io trovo il ragionamento che sta dietro perché diverse decisioni tecniche vengono fatte piuttosto un argomento interessante. Da qualche tempo Ive sviluppa supporto un'applicazione che viene utilizzato in un ambiente Intranet cui la società incaricata browser è ancora IE 6. È stato richiesto che vi sia la funzionalità di stampa in questa applicazione. Come è ben noto (anche da parte di Microsoft se stessi) la funzionalità di stampa in IE 6 non è mai stato fantastico. Ma il requisito per la stampa utilizzabili rimasto. Gli sviluppatori che lavorano sul sistema prima di me ha deciso di sfruttare Crystal Reports (ricordiamo che). In sostanza ci fosse un componente di reporting per l'applicazione nel momento in cui ha creato report personalizzati utilizzando cristallo e li rendeva all'utente sotto forma di file PDF (che sono stati eminentemente stampabile per il tempo che mi preoccupo di ricordare). Uno degli sviluppatori che lavorano sul sistema realizzato che sarebbe stato perfettamente possibile creare dei report all'interno di cristallo che sono stati realmente stampano su schermi PDF per l'applicazione. Ha funzionato bene e questa soluzione rimase in vigore per un tempo molto lungo. Tuttavia, alcuni anni giù la linea Crystal Reports è stato scartato come il meccanismo di segnalazione per l'applicazione. Ma non siamo riusciti a smantellare cristallo del tutto, perché abbiamo ancora bisogno per la stampa. Id mai veramente piaciuto la soluzione di cristallo per una serie di motivi: Abbiamo bisogno proc personalizzati memorizzati per guidare le schermate di stampa di cristallo che erano vicino duplicati delle principali proc app. Questa duplicazione degli sforzi non sembrava giusto. Abbiamo dovuto cambiare IDE ogni volta che stavamo mantenendo i nostri schermi di stampa. E il cristallo IDE non è una gioia da usare. Forse ancora più importante, per alcuni utenti che ci serviva per nascondere bit di informazioni dalla stampa. La versione di Crystal stavamo usando non ha fatto la personalizzazione dinamica della nostra stampa schermi una proposta semplice. (A sua difesa ci mancavano davvero usarlo per quello che è stato progettato per.) Di conseguenza gli sviluppatori prima di me aveva finito per creare diverse versioni di ogni schermata di stampa rivelando diversi livelli di informazioni. Come potete immaginare, questo significa che lo sforzo di apportare modifiche alle schermate di stampa è aumentata in modo esponenziale E 'venuto in mente che sarebbe bene, se siamo riusciti a trovare un modo di generare nostri report in formato PDF senza l'utilizzo di cristallo che sarebbe un passo inoltrare. E 'stato poco dopo che mi è capitato su wkhtmltopdf. Si tratta di un progetto open source che si descrive come un programma di utilità di shell semplice per convertire HTML a PDF utilizzando il motore di rendering WebKit, e QT. L'ho testato su vari siti web e ha funzionato. Non era da qualsiasi sforzo di immaginazione un perfetto HTML a PDF strumento ma la qualità ha prodotto notevolmente superato la presentazione attualmente in vigore tramite Crystal. Questo è stato solo il biglietto. Utilizzando wkhtmltopdf ho potuto avere semplici pagine web nell'applicazione che potrebbe essere convogliata in wkhtmltopdf per fare un PDF a seconda delle necessità. Potrebbe essere dinamica - perché ASP è dinamico. Ci andrei bisogno di scrivere e mantenere più stored procedure personalizzate. E fortunatamente ci sarebbe più bisogno di utilizzare Crystal. Prima che potessimo liberarci di cristallo, però, ho bisogno di un modo che io possa generare questi file PDF al volo all'interno del sito. Per questo ho finito per scrivere una semplice classe wrapper per wkhtmltopdf che potrebbe essere utilizzata per richiamare al volo. Infatti una buona parte di questo è stato derivato da vari contributi su un post su StackOverflow. E 'finito per assomigliare a questo: Con questo involucro ho potuto passare negli URL ed estrarre fuori PDF. Ecco un paio di esempi di me facendo proprio questo: Come si può vedere dal secondo esempio di sopra del suo possibile tubo di un numero di URL nel involucro tutto per essere reso ad un unico PDF. Il più delle volte questo è stato surplus per le nostre esigenze, ma la sua buona per conoscere la sua possibile. Date un'occhiata al sito della BBC PDF generato dal primo esempio: Abbastanza bene, non Come si può vedere la sua non perfetta dal guardare i titoli (bit schiacciata), ma ho volutamente scelto una pagina più complicato per mostrare ciò wkhtmltopdf era capace. Le schermate di stampa che avevo in mente di costruire sarebbe notevolmente più semplice di questo. Una volta che questo era a posto ho potuto scartare la soluzione di cristallo. È stato sostituito con un paio di stampa in PDF ASPXs nel web app principale che sarebbe personalizzata durante il rendering per nascondere i bit rilevanti di dati da parte dell'utente. Questi ASPXs verrebbero convogliati nel metodo HtmlToPdf in base alle esigenze e quindi l'utente sarà reindirizzato a questo PDF. Se per qualche motivo il PDF non è riuscito a rendere gli utenti avrebbero visto la stampa direttamente in formato PDF ASPX - non solo come PDF se si vede quello che voglio dire. Devo dire che è stato piuttosto raro per un PDF di non rendere, ma questa era la mia prova di errore. Questa nuova soluzione ha avuto una serie di aspetti positivi del nostro punto di vista: i tempi di manutenzione per lo sviluppo (e di conseguenza il costo per i nostri clienti) per schermi di stampa è stato notevolmente ridotto. Ciò è dovuto alle schermate di stampa facenti parte del web app principale. Questo significava che condividevano lo stile ecc con tutti gli altri schermi web e la natura dinamica di ASP ha fatto personalizzare uno schermo al volo la semplicità stessa. Eravamo ora in grado di regionalizzare i nostri schermi di stampa per gli utenti allo stesso modo come abbiamo fatto con il nostro principale web app. Questo semplicemente non era realistico con la soluzione di cristallo a causa della quantità di lavoro coinvolti. Credo che questo è una specie di soluzione SECCO :-) Si può facilmente utilizzare il metodo di cui sopra da soli. Tutto quello che dovete fare è scaricare e installare wkhtmltopdf sulla vostra macchina. Vi consiglio utilizzando la versione 0.9.9 come le release candidate successive appaiono leggermente buggy al momento. Un paio di grattacapi: Assicurarsi che si passa il percorso di installazione corretto per il metodo HtmlToPdf se è stato installato ovunque diversa da quella predefinita. Youll vedere che la classe assume il valore di default se non fosse stato passato Assicurarsi che di lettura ed esecuzione diritti sono concessi alla cartella wkhtmltopdf per il processo relativo Assicurarsi che scrivono i diritti vengono concessi per la posizione che si desidera creare i file PDF per il processo in questione Nella nostra situazione stiamo invocando questo direttamente nella nostra applicazione web su richiesta. Non ho idea di come questo sarebbe in scala - forse non bene. Questo non è davvero un problema per noi come la nostra base di utenti è piuttosto piccolo e questa funzionalità è neanche chiamato eccessivamente. Credo che se questo è stato utilizzato molto più di quanto si Id essere tentati di scorporare questa funzionalità in un'applicazione separata. Ma questo funziona solo dandy per now. Process. WaitForExit Method () WaitForExit () rende l'attuale attesa filo fino a quando il processo associato termina. Dovrebbe essere chiamato dopo che tutti gli altri metodi sono chiamati sul processo. Per evitare di bloccare il thread corrente, utilizzare l'evento terminato. Questo metodo indica al componente del processo di aspettare una quantità infinita di tempo per il processo e di gestori di eventi per uscire. Ciò può causare un'applicazione per bloccarsi. Ad esempio, se si chiama CloseMainWindow per un processo che ha un interfaccia utente, la richiesta al sistema operativo per terminare il processo associato potrebbe non essere gestita se il processo viene scritto mai entrare nel suo ciclo di messaggi. Nelle versioni Framework 3.5 e versioni precedenti, la WaitForExit () sovraccarico aspettava millisecondi MaxValue (circa 24 giorni), non a tempo indeterminato. Inoltre, le versioni precedenti non hanno atteso per i gestori di eventi per l'uscita se è stato raggiunto il tempo di MaxValue pieno. Questo sovraccarico assicura che tutta l'elaborazione è stata completata, compresa la gestione di eventi asincroni per standard output reindirizzato. Si dovrebbe usare questo sovraccarico dopo una chiamata al sovraccarico WaitForExit (Int32) quando l'uscita standard è stato reindirizzato a gestori di eventi asincroni. Quando un processo esce associato (cioè, quando viene arrestato dal sistema operativo attraverso una normale chiusura o anormale), il sistema memorizza informazioni amministrative sul processo e ritorna al componente che aveva chiamato WaitForExit (). Il componente processo può quindi accedere alle informazioni, che comprende il ExitTime. utilizzando la maniglia per il processo è terminato. Poiché il processo associato è uscito, la proprietà Handle del componente non fa riferimento a una risorsa processo esistente. Invece, la maniglia può essere utilizzato solo per accedere alle informazioni sistemi operativi sulla risorsa processo. Il sistema è a conoscenza di maniglie ai processi usciti che non sono stati rilasciati da componenti di processo, in modo che mantiene il ExitTime e gestire le informazioni in memoria fino a quando il componente Process libera specificamente le risorse. Per questo motivo, ogni volta che si chiama di avvio per un'istanza di processo, invito a chiudere quando il processo associato è terminato e non è più necessario tutte le informazioni amministrative su di esso. Chiudere libera la memoria allocata per il processo è terminato.

No comments:

Post a Comment