Convertendo arquivos HTML em PDF [fechado]


128

Preciso gerar automaticamente um arquivo PDF a partir de um documento HTML (X) existente. Os arquivos de entrada (relatórios) usam um layout bastante simples, baseado em tabela, portanto, provavelmente não é necessário suporte a coisas realmente sofisticadas de JavaScript / CSS.

Como estou acostumado a trabalhar em Java, é preferível uma solução que possa ser facilmente usada em um projeto java. Porém, ele só precisa funcionar em sistemas Windows.

Uma maneira de fazer isso é viável, mas não produz resultados de boa qualidade (pelo menos fora da caixa), usando CSS2XSLFO e Apache FOP para criar os arquivos PDF. O problema que encontrei foi que, embora os atributos CSS sejam convertidos de maneira adequada, o layout da tabela é bastante complicado, com o texto fluindo para fora da célula da tabela.

Também dei uma olhada rápida no Jrex, uma API Java para usar o mecanismo de renderização Gecko.

Existe talvez uma maneira de pegar a página renderizada do mecanismo de renderização do Internet Explorer e enviá-la para uma ferramenta de impressora PDF automaticamente? Não tenho experiência em programação OLE no Windows, por isso não tenho idéia do que é possível e do que não é.

Você tem alguma ideia?


3
Recentemente, criei um docbag da biblioteca Java que pode converter documentos xhtml em pdf. A versão atual não é nada avançada, mas se seus modelos xhtml forem simples, essa biblioteca pode ser útil.
Jakub Torbicki

Eu acho que o caminho a seguir é usar os recursos do navegador para fazer a tradução. Veja stackoverflow.com/q/25574082/39998
David Hofmann

Estou preso com a geração de pdf a partir de um html que contém letras cirílicas. Está tudo bem, exceto as letras cirílicas que são omitidas. Alguém que tenha esse tipo de problema?
Kristijan Iliev

@krisiliev: Eu tive problemas semelhantes e, até onde me lembro, a fonte usada era muito importante. A maioria das fontes não suporta caracteres UTF8 completos, mas o seguinte deve: 'família de fontes: Arial Unicode MS;' (CSS). Também certifique-se de usar a codificação correta (eu aconselho a usar sempre UTF-8)
panschk

Respostas:


73

O projeto do renderizador Flying Saucer XHTML tem suporte para a saída de XHTML para PDF. Veja um exemplo aqui .


20
O problema real com sauser voando é que ele usa itext para tornar PDF, que é um lib AGPL v3 licenciado
David Hofmann

11
A versão do itext usada pelo Flying Saucer é a 2.0.8, disponível sob LGPL. Somente os números de versão 5 ou superior estão na licença mais restritiva. stackoverflow.com/questions/2692000/…
Gary

8
Eu diria que o verdadeiro problema com o Flying Saucer é que ele requer um documento XML bem formado e válido. É fácil interromper inconscientemente a renderização do PDF, incluindo algo como um e comercial no seu HTML ou algum código javascript que faz com que o HTML renderizado não seja estritamente XHTML. Embora isso possa ser atenuado com testes automatizados ou algum processo que envolva validação XML.
SteveT

3
@LateralFractal Até onde eu sei, o Flying Saucer 9.0.8 (a versão mais recente, eu acho) usa o iText 2.1.7, que é a última versão do iText com uma licença permissiva - LGPL. mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf/…
Jonathan Crosmer

2
@JonathanCrosmer Yeah. Existem dois pacotes FlyingSaucer para PDF, um para o iText v2 e outro para o iText v5. Supondo que ambos tenham igual funcionalidade; o risco AGPL pode ser evitado.
precisa saber é o seguinte

49

Você tentou o WKHTMLTOPDF ?

É um utilitário shell simples, uma implementação de código aberto do WebKit. Ambos são gratuitos.

Criamos um pequeno tutorial aqui

EDIT (2017):

Se fosse para construir algo hoje, eu não seguiria mais esse caminho.
Mas usaria http://pdfkit.org/ .
Provavelmente retirando todas as dependências do nodejs, para rodar no navegador.


16
Para uma conversão direta de html-página-para-pdf, isso é melhor do que qualquer outra coisa que eu já vi, gratuita ou comercial.
MGOwen

Funciona em um Mac OS não?
Eran Medan

1
@ Eran, usamos no linux. Eu acho que há uma versão do Windows também
Mic

1
@ Micr Sim, existe uma versão para Windows também.
Viccari 14/03/12

testado no Windows XP (versão 0.9.9) e funciona muito bem. Além disso, não requer direitos de administrador na máquina para instalar.
Christopher Mahan

44

Confira o iText ; é um kit de ferramentas Java PDF puro que oferece suporte à leitura de dados em HTML. Usei-o recentemente em um projeto quando precisei extrair conteúdo do nosso CMS e exportar como arquivos PDF, e tudo foi bastante direto. O suporte para CSS e tags de estilo é bastante limitado, mas renderiza tabelas sem problemas (nunca consegui definir a largura da coluna).

Criar um PDF a partir do HTML é mais ou menos assim:

Document doc = new Document(PageSize.A4);
PdfWriter.getInstance(doc, out);
doc.open();
HTMLWorker hw = new HTMLWorker(doc);
hw.parse(new StringReader(html));
doc.close();

9
É AGPL, parece ainda pior que GPL, você precisa ser de código aberto, mesmo se apenas fornecer o PDF e o iText estiver do lado do servidor.
Eran Medan

10
@ Eran, basta usar a última versão não AGPL (com.lowagie: itext: 2.1.7 no Maven).
Nowaker

1
O HTMLWorker foi descontinuado nas versões mais recentes do IText em favor do XMLWorker; no entanto, o suporte ao CSS é ruim nos dois casos (consulte demo.itextsupport.com/xmlworker/itextdoc/… ) e não é adequado para minhas necessidades. Pelo contrário, o Flying Saucer foi perfeito.
Pino #:

Você pode usar a versão LGPL o que poderia ser encontrada em github.com/albfernandez/itext2
Vladimir Rozhkov


3

Existe talvez uma maneira de pegar a página renderizada do mecanismo de renderização do Internet Explorer e enviá-la para uma ferramenta de impressora PDF automaticamente?

É assim que o ActivePDF funciona, o que é bom significa que você sabe o que obterá e, na verdade, possui um suporte de estilo razoável.

É também um dos poucos pacotes que encontrei (quando analisamos alguns anos atrás) que realmente suporta os vários comandos CSS de quebra de página.


Infelizmente, o software ActivePDF é muito frustrante - já que ele precisa iniciar o navegador IE em segundo plano para conversões, pode ser bastante lento e também não é particularmente estável.

Atualmente, existe uma nova versão na versão beta que deveria ser muito melhor, mas eu não tive a chance de experimentá-la, então não sei o quanto de melhoria é essa.


Obrigado pela resposta útil. Não acho que o ActivePDF seja realmente adequado por causa do preço, mas é bom saber que algo assim existe.
panschk

API de HTML para PDF do GrabzIt : grabz.it/html-to-pdf-image-api.aspx Funciona da mesma maneira que renderiza o HTML em um navegador e depois cria o PDF, garantindo uma conversão de PDF muito mais precisa.
precisa saber é o seguinte

2

Você pode usar um firefox sem cabeça com uma extensão. É muito chato para correr, mas produz bons resultados.

Confira esta resposta para mais informações.


Não soa como uma solução muito escalável se for necessário converter páginas em tempo real para pdf em paralelo. Se forem solicitadas algumas solicitações que resultam em uma conversão usando o FF, o servidor perderá alguns GIG de memória apenas para servir algumas páginas convertidas. Isso abriria seu servidor para um DOS.
mP.

Melhor, mas semelhante: github.com/ariya/phantomjs/wiki/Screen-Capture (de acordo com we-love-php.blogspot.com/2012/12/... o pdf tem texto real, não rasterized)
nafg

0

Se você olhar para a barra lateral da sua pergunta, verá muitas perguntas relacionadas ...

No seu contexto, o método mais simples pode ser instalar um driver de impressão PDF, como o PDFCreator, e apenas imprimir a página nesta saída.


Como isso é uma solução Java? Este é um driver de impressão do Windows.
Grey

O OP mencionou explicitamente o Windows. E suponho que haja drivers semelhantes para outros sistemas. O OP só mencionou Java como uma solução possível ...
PhiLho

0

Amyuni WebkitPDF pode ser usado com o JNI para uma solução apenas para Windows. Esta é uma biblioteca de conversão de HTML para PDF / XAML, gratuita para uso comercial e não comercial.

Se os arquivos de saída não forem necessários imediatamente, para melhor escalabilidade, talvez seja melhor ter uma fila e alguns processos em segundo plano retirando itens de lá, convertendo-os e armazenando-os no banco de dados ou sistema de arquivos.

isenção de responsabilidade usual se aplica

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.