Existe uma maneira de gerar pdf contendo símbolos não-ascii com pisa a partir django modelo?

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu estou tentando gerar um PDF a partir de modelo usando esse trecho:

def write_pdf(template_src, context_dict):
    template = get_template(template_src)
    context = Context(context_dict)
    html  = template.render(context)
    result = StringIO.StringIO()
    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result)
    if not pdf.err:
        return http.HttpResponse(result.getvalue(), mimetype='application/pdf')
    except Exception('PDF error')

Todos os caracteres não-latinos não estão mostrando corretamente, o modelo e vista são salvas usando a codificação utf-8.

Eu tentei salvar vista como ANSI e depois para unicode usuário (html, "UTF-8"), mas ele lança TypeError.

Também eu pensei que talvez seja porque as fontes padrão de alguma forma não suportam UTF-8 assim de acordo com a documentação pisa Tentei conjunto fontface no corpo de modelo na seção de estilo.

Isso ainda não deu resultados.

Será que qualquer um tem algumas idéias de como resolver este problema?

Foi útil?

Solução

Isto funciona para mim:

pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8')

Outras dicas

Tente substituir

pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result)

com

pdf = pisa.pisaDocument(StringIO.StringIO(html), result, encoding='UTF-8')

Ou confira esta resposta para html para pdf para um Django site?

Você precisa modificar seu modelo de Django. Adicionar um novo tipo de letra na folha de estilo que irá conectar-se a um arquivo de fonte com caracteres utilizados no seu documento. E esse arquivo fonte deve ser acessível a partir de seu servidor (sob Ubuntu você pode encontrar arquivos com fontes em / usr / share / fonts / truetype / diretório). Por exemplo:

@font-face {
  font-family: DejaMono; 
  src: url(font/DejaVuSansMono.ttf);
}

Então, se você tem ao lado de código HTML:

<div>Some non-latin characters</div>

você pode indicar esse texto em fonte DejaMono com esta regra CSS:

div { font-family: DejaMono; }

Isso funciona para mim quando eu gerar documentos PDF com caracteres cirílicos.

Eu enfrentei o mesmo problema com caracteres cirílicos.

A solução continha dois passos: 1. Aponte o arquivo de fonte no seu arquivo HTML

<style type="text/css">
@font-face {
  font-family: Arial; src: url("files/arial.ttf");
}
body {
  font-family: Arial;
}
</style>

2. Dê "pisa" caminho raiz (para que ele encontrar o arquivo fonte, caminho relativo) no meu caso, foi algo como isto

pdf = pisa.pisaDocument(html, result, path=PATH_TO_DJANGO_PROJECT)

porque as fontes foram colocados em PATH_TO_DJANGO_PROJECT / files / arial.ttf

Se você está chamando CreatePDF em vez do método pisaDocument, você pode usar

pisa.CreatePDF(html.encode('UTF-8'), response, link_callback=fetch_resources, encoding='UTF-8')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top