Thursday 13 June 2019

Wkhtmltopdf c # process waitforexit


Atualização 03012017 Ive escreveu uma publicação subseqüente que se baseia no trabalho desta publicação original. A nova publicação expõe esta funcionalidade através de um serviço WCF e pode ser encontrada aqui. Fazendo PDFs do HTML Eu queria falar sobre uma abordagem que eu descobri para fazer PDFs diretamente do HTML. Eu percebo que, nesses dias selvagens e loucos de PDF. js e coisas parecidas, técnicas como esta devem parecer muito antigas. Dito isto, esta técnica funciona e, mais importante, resolve um problema com o qual fui confrontado, mas sem forçar os usuários a moverem a versão mais recente do X. Muito como muitos gostariam de resolver problemas dessa maneira, infelizmente, muitas corporações se movem mais devagar que isso E, entretanto, ainda temos que entregar - ainda temos que atender aos requisitos. Ao invés de simplesmente dizer que fiz isso, pensei que eu recordei como eu cheguei a esse ponto em primeiro lugar. Eu não sei sobre você, mas acho o raciocínio por que diferentes decisões técnicas são um tópico bastante interessante. Durante algum tempo, estou desenvolvendo o suporte a um aplicativo que é usado em um ambiente de intranet onde o navegador mandatado pela empresa ainda é o IE 6. Era uma exigência de que haja funcionalidade de impressão nesta aplicação. Como é bem conhecido (mesmo pela própria Microsoft), a funcionalidade de impressão no IE 6 nunca foi fantástica. Mas o requisito para impressões utilizáveis ​​permaneceu. Os desenvolvedores que trabalharam no sistema antes de mim decidiram aproveitar o Crystal Reports (lembre-se disso). Essencialmente, havia um componente de relatório para o aplicativo no momento em que criaram relatórios personalizados usando o Crystal e os renderizou ao usuário sob a forma de PDFs (que foram imprimidos eminentemente por tanto tempo quanto eu me lembro). Um dos desenvolvedores que trabalhavam no sistema percebeu que seria perfeitamente possível criar alguns relatórios no Crystal que eram realmente impressos em telas de PDF para o aplicativo. Funcionou bem e esta solução permaneceu em vigor há muito tempo. No entanto, alguns anos abaixo, o Crystal Reports foi descartado como o mecanismo de relatório para o aplicativo. Mas não conseguimos desarmar o Crystal completamente porque ainda precisávamos para impressão. Eu nunca gostei muito da solução Crystal por vários motivos: precisávamos de procs armazenados personalizados para dirigir as telas de impressão Crystal que estavam perto de duplicatas dos procs principais do aplicativo. Essa duplicação de esforços nunca se sentiu correta. Tivemos que trocar IDE sempre que estivéssemos mantendo nossas telas de impressão. E o Crystal IDE não é uma alegria de usar. Talvez o mais importante, para certos usuários, precisávamos esconder fragmentos de informação da impressão. A versão do Crystal que estávamos usando não fez a personalização dinâmica de nossas telas de impressão uma proposição direta. (Na sua defesa, nós realmente não o usamos para o que foi projetado). Como resultado, os desenvolvedores antes de mim acabaram criando várias versões de cada tela de impressão revelando diferentes níveis de informação. Como você pode imaginar, isso significou que o esforço envolvido em fazer mudanças nas telas de impressão aumentou exponencialmente. Ocorreu-me que seria bom se pudéssemos encontrar algum meio de gerar nossos próprios relatórios PDF sem usar o Crystal que seria um passo progressivo. Foi pouco depois disso que eu aconteceu com o WKHTMLtoPDF. Este é um projeto de código aberto que se descreve como um utilitário de shell simples para converter html em pdf usando o mecanismo de renderização do webkit e qt. Testei tudo em vários sites e funcionou. Não foi por qualquer trecho da imaginação uma ferramenta HTML perfeita para PDF, mas a qualidade que produziu superou a apresentação atualmente no lugar através do Crystal. Este era apenas o bilhete. Usando WKHTMLtoPDF, eu poderia ter páginas web simples no aplicativo que poderiam ser encaminhadas para WKHTMLtoPDF para fazer um PDF conforme necessário. Pode ser dinâmico - porque o ASP é dinâmico. Nós não precisamos escrever e manter procs armazenados personalizados. E, felizmente, não precisamos mais usar o Crystal. Antes de poder livrar-nos de Crystal, eu precisava de uma maneira que eu pudesse gerar esses PDFs em tempo real dentro do site. Para isso eu acabei escrevendo uma classe de wrapper simples para WKHTMLtoPDF, que poderia ser usado para invocá-lo na marcha. Na verdade, uma boa parte disso foi derivada de várias contribuições em uma publicação no StackOverflow. Isso acabou parecendo assim: com este invólucro, eu poderia passar URLs e extrair PDFs. Heres alguns exemplos de mim fazendo exatamente isso: como você pode ver no segundo exemplo acima, é possível canalizar uma série de URLs para o wrapper tudo a ser renderizado para um único PDF. Na maioria das vezes isso era um excedente para nossos requisitos, mas é bom saber o possível. Dê uma olhada no site da BBC PDF gerado pelo primeiro exemplo: muito bom, não. Como você pode ver, não é perfeito de olhar para os títulos (bit esmagado), mas eu deliberadamente escolhi uma página mais complicada para mostrar o que WKHTMLtoPDF era capaz. As telas de impressão que eu tinha em mente para construir seria significativamente mais simples do que isso. Uma vez que este estava no lugar, eu pude acabar com a solução Crystal. Ele foi substituído por um par de impressões em PDF ASPXs no aplicativo web principal que seria personalizado ao renderizar para ocultar os bits relevantes de dados do usuário. Esses ASPXs seriam encaminhados para o método HtmlToPdf conforme necessário e, em seguida, o usuário seria redirecionado para esse PDF. Se, por algum motivo, o PDF não conseguiu processar os usuários veriam a impressão direta para PDF ASPX - simplesmente não como PDF, se você entende o que quero dizer. Devo dizer que era bastante raro que um PDF não fosse renderizado, mas este era o meu failsafe. Esta nova solução teve uma série de vantagens na nossa perspectiva: o tempo de manutenção do desenvolvimento (e conseqüentemente o custo para nossos clientes) para telas de impressão foi significativamente reduzido. Isso ocorreu porque as telas de impressão faz parte do aplicativo web principal. Isso significava que eles compartilhavam estilo, etc. com todas as outras telas da web e a natureza dinâmica do ASP fazia a personalização de uma tela na própria simplicidade. Agora fomos capazes de regionalizar nossas telas de impressão para os usuários da mesma maneira que fizemos com nosso aplicativo web principal. Isso não era realista com a solução Crystal devido à quantidade de trabalho envolvido. Eu acho que isso é uma espécie de solução DRY :-) Você pode usar facilmente a abordagem acima. Tudo o que você precisa fazer é baixar e instalar o WKHTMLtoPDF em sua máquina. Eu aconselho o uso da versão 0.9.9 quando os candidatos da versão posterior aparecem um pouco buggy no momento. Casal de gotchas: Certifique-se de que você passa o caminho de instalação correto para o método HtmlToPdf se você o instalou em outro lugar que não seja o local padrão. Você verá que a classe assume o padrão se não for aprovada. Certifique-se de que os direitos de leitura e execução sejam concedidos à pasta wkhtmltopdf para o processo relevante Certifique-se de que os direitos de gravação são concedidos para o local que deseja criar seus PDF para o processo relevante Em nossa situação Estamos invocando isso diretamente na nossa aplicação web sob demanda. Não tenho ideia de como isso escalaria - talvez não esteja bem. Este não é realmente um problema para nós, pois nossa base de usuários é bastante pequena e essa funcionalidade não é chamada excessivamente. Eu acho que se isso fosse usado muito mais do que é Id ser tentado a cortar essa funcionalidade em um aplicativo separado. Mas isso funciona apenas dandy por agora. Processo. WaitForExit Method () WaitForExit () faz o thread atual aguardar até o processo associado terminar. Ele deve ser chamado após todos os outros métodos serem chamados no processo. Para evitar o bloqueio da linha atual, use o evento Exitado. Este método instrui o componente Processo a aguardar uma quantidade infinita de tempo para que o processo e os manipuladores de eventos saem. Isso pode fazer com que um aplicativo pare de responder. Por exemplo, se você chamar CloseMainWindow para um processo que tenha uma interface de usuário, a solicitação ao sistema operacional para encerrar o processo associado pode não ser tratada se o processo for gravado para nunca entrar no loop de mensagem. No Quadro 3.5 e versões anteriores, a sobrecarga WaitForExit () esperava milissegundos MaxValue (aproximadamente 24 dias), não indefinidamente. Além disso, as versões anteriores não esperaram que os manipuladores de eventos saíssem se o tempo MaxValue completo fosse atingido. Essa sobrecarga garante que todo o processamento foi concluído, incluindo o tratamento de eventos assíncronos para a saída padrão redirecionada. Você deve usar essa sobrecarga após uma chamada para a sobrecarga WaitForExit (Int32) quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos. Quando um processo associado sai (ou seja, quando é desligado pelo sistema de operação através de um término normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit (). O componente Processo pode acessar a informação, que inclui o ExitTime. Usando o Handle para o processo encerrado. Como o processo associado saiu, a propriedade Handle do componente já não aponta para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar a informação dos sistemas operacionais sobre o recurso do processo. O sistema está ciente das alças para os processos que não foram lançados pelos componentes do Processo, portanto, mantém as informações ExitTime e Handle na memória até que o componente Processo liberte especificamente os recursos. Por esse motivo, sempre que ligar a instância do Começo para um processo, chame Close quando o processo associado tiver terminado e você não precisa mais de informações administrativas sobre isso. Fechar liberta a memória alocada para o processo encerrado.

No comments:

Post a Comment