Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Inserir Formas em imagem no word usando Python

Olá

Estou trabalhando em um projeto em que preciso inserir um balão com texto em uma imagem de um relatório que está sendo escrito no word, como na imagem abaixo: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Atualmente, existe alguma biblioteca que tenha essa função de inserir formas? Procurei na documentação da python-docx mas não encontrei nada relacionado.

A ideia de inserir esse balão pelo word é devido a facilidade de realizar o seu reposicionamento após gerado o relatório.

2 respostas
solução!

Olá Rafael, tudo bem com você?

Peço desculpas pela demora em lhe responder.

Manipular a imagem utilizando a biblioteca de documentos do word não é impossível, mas pode ser bem trabalhoso. Para o seu cenário específico, algo que podemos fazer é manipular a própria imagem utilizando a Pillow, uma biblioteca específica para manipulação de imagens. Junto a ela, também podemos utilizar a matplotlib tanto para mostrar a imagem na tela, quanto para realizar o salvamento do arquivo.

O código ficaria da seguinte forma:

import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont

imagem_base = Image.open("imagem.png")
fonte_padrao = ImageFont.truetype('Gidole-Regular.ttf', size=16)
draw = ImageDraw.Draw(imagem_base)
draw.rectangle(((230, 30), (350, 90)), fill="black")
draw.text((250, 40), "Cord:\n9999.999", font=fonte_padrao)
imagem_base.save('nova_imagem.png')
plt.imshow(imagem_base)
plt.show()

Imagem_base

Inicio da transcrição. A imagem apresenta um trecho de uma rua em um mapa, temos nesta imagem uma janela no canto inferior direito que apresenta os dados de coordenadas, o fundo da imagem é bege. Final da transcrição.

Resultado a partir do código

Inicio da transcrição. A imagem apresenta um trecho de uma rua em um mapa, na parte superior central temos um retângulo de fundo preto escrito “Cord:9999.999”, o retângulo e o texto foram inseridos com o código anterior, temos nesta imagem uma janela no canto inferior direito que apresenta os dados de coordenadas, o fundo da imagem é bege . Final da transcrição

Pontos importantes.

  • Na linha de código, draw.rectangle(((230, 30), (350, 90)), fill="black"), temos:

    • O conjunto de coordenadas para desenhar o retângulo x1, y1 = (230, 30) e x2, y2 = (350, 90) preenchidos pela cor preta.
  • Na linha, draw.text((250, 40), "Cord:\n9999.999", font=fonte_padrao), temos:

    • A coordenada de início do texto x = 250 e y = 40, o texto que será inserido na imagem e a fonte que escolhemos.
  • Para esse código de exemplo foi utilizado a fonte Gidole Regular e você pode fazer o download dela neste link.

Para saber um pouco mais sobre a manipulação de imagens com a biblioteca Pillow, recomendo a leitura dos artigos abaixo, neles são apresentados outras possibilidades de manipulação de imagens, seja desenhando outras formas ou escrevendo em outros locais.

Os artigos acima estão em inglês, caso tenha dificuldade com o idioma, recomendo o uso do tradutor do navegador.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá Felippe,

Obrigado pela sugestão.

Através dos meus estudos percebi a dificuldade em trabalhar com o relatório em Word, e por isso resolvi formatá-lo em HTML e depois converter para PDF, visto que o mesmo também pode ser entregue nesse formato.

Com a possibilidade de se trabalhar com o PDF, encontrei algumas bibliotecas que possivelmente atenderiam meu problema, dentre elas a pdf-annotate. Através dessa biblioteca consegui chegar na caixa com texto mostrado na imagem abaixo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Até esse ponto tudo bem, entretanto, ao movimentá-la com o mouse para reposicionar no melhor local da imagem do relatório, o texto acaba saindo da formatação inicial e desalinhando com o retângulo preto. Não consegui identificar a origem desse problema. Aparenta ser uma incompatibilidade com a forma gerada pelo pdf-annotate e o leitor de PDF utilizado no Windows. Além disso, o fato de serem dois objetos distindos (retângulo preto e a caixa de texto), a ação de ter que selecionar os dois para movimentar o objeto como um todo se torna trabalhosa.

Tendo como base a premissa inicial do projeto, que é a redução no tempo de elaboração do relatório, optei, por hora, por fazer a inserção desse objeto pelo próprio leitor de PDF, dado que, com apenas 3 cliques e um "CTRL+V" eu consigo obter o resultado abaixo já posicionado no local correto da imagem.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Decidi manter essa etapa da forma mais simples citada acima e dei seguimento com o projeto. Talvez no futuro, ao tentar implementar melhorias, eu volte a trabalhar nesse problema.

No mais, muito obrigado.

Abraço.