Estou tentando exibir um PDF que criei (usando fpdf2) em um aplicativo Pyside6.
Parece haver dois caminhos lá:
Posso usar o QWebEngineView com plugins habilitados, nos quais posso injetar os bytes brutos do PDF, o que funciona. Não é o ideal para mim, pois há muita UI envolvida; gostaria de algo mais limpo.
Ou posso usar QPdfView. Esse widget pega um objeto QPdfDocument do qual ele lê. Infelizmente, QPdfDocument só tem uma função .load() que pega um nome de arquivo. Como estou procurando evitar gravações de disco lá, não estou interessado em salvar temporariamente o arquivo no disco para mostrá-lo na GUI.
Há duas assinaturas na função .load():
Supported signatures:
PySide6.QtPdf.QPdfDocument.load(PySide6.QtCore.QIODevice, /)
PySide6.QtPdf.QPdfDocument.load(str, /)
O problema é o seguinte: não consigo instanciar um QIODevice do Python, então não consigo alimentá-lo com bytes de PDF como um buffer (há uma função .write() que parece interessante). Tentei usar BytesIO (do pacote io), mas não tive sorte.
Existe uma maneira de criar um objeto QPdfDocument a partir de bytes de um arquivo PDF?
Obrigado pela ajuda!
Você precisa usar um QBuffer (que herda
QIODevice
) apoiado por um QByteArray contendo os dados de bytes do pdf. O buffer não assume a propriedade dos dados, e o documento não assume a propriedade do buffer, então você precisa garantir que esses objetos sejam mantidos ativos enquanto o pdf está carregando. Um slot conectado ao sinal statusChanged pode ser usado para limpar os objetos assim que o documento for carregado (ou se ocorrer um erro). Um exemplo básico que implementa tudo isso é dado abaixo (basta fornecer um caminho de arquivo pdf como um argumento de linha de comando para testá-lo).(PS: durante o teste, descobri que o visualizador falha na segmentação ao sair se um documento foi carregado com sucesso. Isso acontece mesmo ao carregar de um caminho de arquivo. O problema é bastante inofensivo e pode ser facilmente corrigido fechando explicitamente o documento antes de fechar o aplicativo. Tenho o mesmo problema usando PySide-6.8.3 ou PyQt-6.8.1 com Qt-6.8.3 no Linux, então parece ser causado por um bug do Qt. É possível que outras versões/plataformas não sejam afetadas).
DEMONSTRAÇÃO :