Respostas:
Acabei de escrever uma biblioteca chamada jsPDF, que gera PDFs usando apenas Javascript. Ainda é muito jovem, e adicionarei recursos e correções de erros em breve. Também recebi algumas idéias para soluções alternativas em navegadores que não oferecem suporte a URIs de dados. É licenciado sob uma licença liberal do MIT.
Me deparei com essa pergunta antes de começar a escrevê-la e pensei em voltar e informar você :)
Exemplo: crie um arquivo PDF "Hello World".
// Default export is a4 paper, portrait, using milimeters for units
var doc = new jsPDF()
doc.text('Hello world!', 10, 10)
doc.save('a4.pdf')
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.debug.js"></script>
Outra biblioteca javascript que vale a pena mencionar é o pdfmake .
O suporte ao navegador não parece ser tão forte quanto o jsPDF, nem parece haver uma opção para formas, mas as opções para formatar o texto são mais avançadas que as opções atualmente disponíveis no jsPDF.
Eu mantenho o PDFKit , que também alimenta o pdfmake (já mencionado aqui). Ele funciona no Node e no navegador e suporta várias coisas que outras bibliotecas não:
Confira http://pdfkit.org/ para um tutorial completo e veja por si mesmo o que o PDFKit pode fazer. E, para um exemplo de que tipos de documentos podem ser produzidos, confira os documentos como um PDF gerado a partir de alguns arquivos do Markdown usando o próprio PDFKit: http://pdfkit.org/docs/guide.pdf .
Você também pode experimentá-lo interativamente no navegador aqui: http://pdfkit.org/demo/browser.html .
Outro projeto interessante é o texlive.js .
Ele permite que você compile (La) TeX para PDF no navegador.
Você pode usar este serviço gratuito adicionando um link que cria pdf a partir de qualquer URL (por exemplo, http://www.phys.org ):
Mesmo se você pudesse gerar o PDF na memória em JavaScript, ainda teria o problema de como transferir esses dados para o usuário. É difícil para o JavaScript simplesmente enviar um arquivo ao usuário.
Para obter o arquivo para o usuário, você deve enviar um servidor para que o navegador abra a caixa de diálogo Salvar.
Com isso dito, realmente não é muito difícil gerar PDFs. Basta ler as especificações.