Como faço para transformar uma página do ColdFusion em um download de PDF?

StackOverflow https://stackoverflow.com/questions/73964

  •  09-06-2019
  •  | 
  •  

Pergunta

Gostaria de transformar o HTML gerado pela minha página CFM em um PDF e fazer com que o usuário receba o prompt padrão "Salvar como" ao navegar para minha página.

Foi útil?

Solução

Você deve usar a tag cfdocument (com format="PDF") para gerar o PDF, colocando-o ao redor da página que você está gerando.Você desejará especificar um atributo de nome de arquivo, caso contrário, o documento será transmitido diretamente para o seu navegador.

Depois de salvar o conteúdo como PDF, use cfheader e cfcontent combinados para gerar o PDF como um anexo ("Salvar como") e adicione o arquivo ao fluxo de resposta.Também adicionei deletefile="Yes" na tag cfcontent para manter o sistema de arquivos limpo de arquivos.

<cfdocument format="PDF" filename="file.pdf" overwrite="Yes">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>Hello World</title>
</head>
<body>
    Hello World
</body>
</html>
</cfdocument>
<cfheader name="Content-Disposition" value="attachment;filename=file.pdf">
<cfcontent type="application/octet-stream" file="#expandPath('.')#\file.pdf" deletefile="Yes">

Como um aparte:Estou usando apenas file.pdf para o nome do arquivo no exemplo abaixo, mas você pode querer usar alguma string aleatória ou gerada por sessão para o nome do arquivo para evitar problemas resultantes de condições de corrida.

Outras dicas

Se você quiser evitar o armazenamento do PDF, usar cfdocument sem nome de arquivo enviará o pdf (de flashpaper) diretamente para o navegador sem usar cfheader e cfcontent.

Embargo:Assim como usar cfheader/cfcontent, você precisa fazer isso antes que o cache seja liberado para o navegador, já que basicamente faz a mesma coisa sem precisar armazenar o arquivo.

Para obter o conteúdo, eu provavelmente usaria cfsavecontent agrupado nas mesmas chamadas/inclui/etc.que geram a página, com duas exceções principais.O cfdocument parece ter problemas com folhas de estilo externas, portanto, usar um include para colocar os estilos diretamente no documento é provavelmente uma boa ideia.Você pode tentar usar @import - funciona para algumas pessoas.Além disso, eu teria cuidado com links relativos a imagens, pois às vezes eles podem quebrar.

O <cfdocument> abordagem é a forma sancionada de fazer isso, porém não oferece tudo o que é possível na forma de manipulação de documentos PDF existentes.Tive um projeto em que precisava gerar cupons com base em um modelo PDF pré-concebido e com resolução de impressão. <cfdocument> teria me permitido aproximar a saída, mas apenas com imagens bitmap incorporadas em HTML.É verdade que eu poderia falsificar a resolução de impressão criando uma imagem grande e dimensionando-a em HTML, mas o original era um arquivo de imagem vetorial bonito e limpo e eu queria usá-lo.

Acabei usando uma cópia de <cfx_pdf> para fazer o trabalho.(Site do desenvolvedor, Loja de tags CF) É um wrapper CF em torno de uma biblioteca Java PDF que permite manipular documentos PDF existentes, incluindo preencher formulários PDF, definir permissões, mesclar arquivos, desenhar gráficos vetoriais, tabelas e texto, usar fontes personalizadas, etc., etc.Se você estiver disposto a trabalhar com isso, poderá obter resultados espetaculares.

A única desvantagem é que parece que o desenvolvedor deixou este produto no pasto por um longo tempo.O site do desenvolvedor ainda tem copyright de 2003 e não menciona nada além do ColdFusion MX 6.1.Acabei tendo que quebrar alguns dos modelos criptografados para corrigir alguns bugs e fazê-los funcionar conforme necessário.No entanto, é uma ferramenta poderosa.

Não estou familiarizado com o ColdFusion, mas o que você precisa fazer é definir o Content-Type da página quando o usuário solicitar que seja application/octet-stream.Isso sempre solicitará um download.

Espero que isto ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top