O tópico hoje pode parecer bestinha e muita gente pode não ver utilidade. Mas a realidade é que eu tive um problema e resolvi com programação então decidi postar. E de quebra dá pra ensinar como converter pdf em imagem e imagem em pdf usando programação, sem necessidade de softwares externos.
Precisei abrir um processo no órgão onde trabalho de progressão por capacitação. Dentro do processo eu deveria anexar um certificado de conclusão de um curso, estilo este:

Eu fiz um curso e o certificado foi emitido em PDF. Eu precisava assinar no certificado, mas como estava em PDF, eu precisaria imprimir o certificado e assinar e em seguida digitalizar o documento para enfim enviar no processo.
Caso o certificado fosse emitido em formato de imagem eu poderia usar um Paint da vida, bem grosseiramente, e adicionar uma assinatura digital ao campo de assinatura e enviar.
Então eu pensei: vou transformar meu certificado em imagem, assinar, transformar em PDF novamente e anexar ao processo.
Para isso, irei usar duas libs do Python chamadas img2pdf e pdf2image, além da Pillow que é usada para abrir as imagens:
(venv) Extra 18$ pip install pdf2image img2pdf
...
Successfully installed img2pdf-0.3.3 pdf2image-1.9.0 pillow-6.1.0
Mandando o comando dessa forma, somente instalando as duas libs, pillow é instalada de forma automática pois é dependência da lib img2pdf.
Então, basicamente, eu irei abrir meu certificado em formato imagem (jpeg), irei assinar o documento usando uma assinatura digital e salvarei novamente em formato PDF.
>>> from img2pdf import convert
>>> from pdf2image import convert_from_path
Inicialmente, vamos converter o pdf em imagem:
>>> pdf_file = convert_from_path('modelo certificado.pdf')
>>> pdf_file
[<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=2339x1654 at 0x7F9741AAD0B8>]
Acima eu converti o PDF em imagem e ao chamar a variável, Python me retornou uma lista com um objeto de PIL do tipo PIL.PpmImagePlugin.PpmImageFile. Temos uma imagem. Podemos até conferir se a imagem está correta pedindo a função show:
>>> pdf_file[0].show()
A imagem irá aparecer na tela.
Mas eu ainda não tenho um arquivo de imagem, somente a imagem carregada em memória no Python. Irei salvar minha imagem em JPEG:
>>> pdf_file[0].save('certificado.jpg', 'JPEG')
Agora já tendo uma imagem, eu posso adicionar a assinatura da forma que eu quiser. Algo comum é ter uma assinatura já digitalizada e só anexar à imagem, redimensionando de acordo com a imagem do certificado. Aqui eu irei assinar usando o Paint só para ilustrar:

Documento assinado. Agora posso converter em PDF novamente. Irei usar a função convert de img2pdf e o gerenciador de contexto "with", que, dentre outras funções, abre e fecha um arquivo de forma automática, sem precisarmos usar a função "close". Já usei o "with" em tópicos anteriores.
>>> with open('outputpdf.pdf', 'wb') as new_pdf_file:
... new_pdf_file.write(convert('certificado.jpg'))
Acima, eu criei um arquivo chamado "outputpdf.pdf" no modo de escrita e em binário (por isso o "wb") e usei um apelido para esse novo arquivo, que é a variável "new_pdf_file". Em seguida, escrevi por cima desse documento usando a conversão da imagem assinada para PDF. Por fim, o gerenciador de contexto "with" tratou de fechar meu arquivo.
Agora, eu tenho um pdf de saída chamado "outputpdf.pdf".

Poderíamos, como eu disse, já ter uma assinatura digital e só adicionar ao documento, o que torna esse tipo de tarefa de assinatura de documentos bem mais prática.
Portanto, com esse probleminha besta que eu tive hoje deu pra ensinar como transformar PDFs em imagens e imagens em PDFs usando Python.
Como um extra do extra, caso o meu PDF tenha várias páginas, é só eu converter todas as páginas em imagens e ao final, todas as imagens em um único PDF com várias páginas novamente, usando algo assim:
>>> # Carrega em memória as imagens do pdf
>>> pdf_file_with_2_pages = convert_from_path('modelo certificado.pdf')
>>> # Confirmando que são duas páginas no pdf, o retorno será uma lista com dois itens
>>> pdf_file_with_2_pages
[<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=2339x1654 at 0x7F974143E780>, <PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=2339x1654 at 0x7F974143E0B8>]
>>> # Salvando as duas páginas em arquivos de imagem
>>> for i, page in enumerate(pdf_file_with_2_pages):
... page.save(f'image{i}.jpg', 'JPEG')
>>> # O código acima criou duas imagens, image0.jpg e image1.jpg
>>> # Agora irei capturar todas as imagens usando a lib "os" para me ajudar
>>> # Capturadas as imagens usando uma listcomp, irei escrever no meu pdf cada imagem como se fosse uma página dele
>>> from os import listdir
>>> with open('out.pdf', 'wb') as pdf:
... pdf.write(convert([j for j in listdir('.') if j.endswith('.jpg')]))
O código já está explicando pelos comentários, mas o final merece um destaque, que é o uso da função listdir de "os". Eu usei várias vezes a lib "glob" pra esse tipo de problema mas aqui estou usando o sistema operacional. A função listdir (que recebe como parâmetro o path, e se eu não tenho path preciso passar como argumento ('.')) lista dentro de um diretório todos os arquivos que estão nele. Usando a listcomp acima, eu só listei dentro do meu diretório os itens que terminam na extensão "jpg" e fiz a escrita de meu pdf com todos os arquivos .jpg dentro do diretório. Dessa forma eu crio um PDF com várias páginas caso seja necessário.