Tenho tentado exibir o arquivo PDF que estou obtendo como um blob de uma $http.post
resposta. O pdf deve ser exibido dentro do aplicativo usando<embed src>
por exemplo.
Eu me deparei com alguns posts, mas de alguma forma meu exemplo não parece funcionar.
JS:
De acordo com este doc , continuei e tentei ...
$http.post('/postUrlHere',{myParams}).success(function (response) {
var file = new Blob([response], {type: 'application/pdf'});
var fileURL = URL.createObjectURL(file);
$scope.content = fileURL;
});
Agora, pelo que entendi, fileURL
cria um URL temporário que o blog pode usar como referência.
HTML:
<embed src="{{content}}" width="200" height="200"></embed>
Não tenho certeza de como lidar com isso no Angular, a situação ideal seria (1) atribuí-lo a um escopo, (2) 'preparar / reconstruir' o blob para um pdf (3) passá-lo para o HTML usando<embed>
porque eu deseja exibi-lo no aplicativo.
Venho pesquisando há mais de um dia, mas de alguma forma não consigo entender como isso funciona no Angular ... E vamos apenas assumir que as bibliotecas do visualizador de PDF por aí não eram uma opção.
Respostas:
Primeiro de tudo, você precisa definir o
responseType
paraarraybuffer
. Isso é necessário se você deseja criar um blob de seus dados. Consulte Sending_and_Receiving_Binary_Data . Portanto, seu código será semelhante a este:A próxima parte é, você precisa usar o serviço $ sce para tornar o angular trust seu url. Isso pode ser feito desta forma:
Não se esqueça de injetar o serviço $ sce .
Se tudo isso estiver feito, agora você pode incorporar seu pdf:
fonte
$http.get
por um completo, especificando oresponseType
campo:{ url: "http://127.0.0.1:8080/resources/jobs/af471106-2e71-4fe6-946c-cd1809c659e5/result/?key="+$scope.key, method: "GET", headers: { 'Accept': 'application/pdf' }, responseType: 'arraybuffer' }
E funciona :)response.data
vez deresponse
, assim:var file = new Blob([response.data], {type: 'application/pdf'});
Eu uso AngularJS v1.3.4
HTML:
Controlador JS:
Serviços JS:
Java REST Web Services - Spring MVC:
fonte
as sugestões de Michael funcionam perfeitamente para mim :) Se você substituir $ http.post por $ http.get, lembre-se de que o método .get aceita 2 parâmetros em vez de 3 ... é aqui que perco meu tempo ...;)
controlador:
Visão:
fonte
responseType:'arraybuffer'
, só me salvou algumas horas de sono! +1$scope.content = $sce.trustAsResourceUrl(fileURL);
com$window.open(fileURL, '_self', '');
e abra o arquivo em tela cheia.Tive dificuldades em usar "window.URL" com o navegador Opera, pois resultaria em "indefinido". Além disso, com window.URL, o documento PDF nunca foi aberto no Internet Explorer e no Microsoft Edge (ele ficaria esperando para sempre). Eu vim com a seguinte solução que funciona no IE, Edge, Firefox, Chrome e Opera (não testei com Safari):
Deixe-me saber se ajudou! :)
fonte
Adicionar responseType à solicitação feita a partir do angular é de fato a solução, mas para mim não funcionou até que eu defina responseType como blob , não como arrayBuffer. O código é autoexplicativo:
fonte
'blob'
tipo é possível escrever mais curto:FileSaver.saveAs(response.data, getFileNameFromHttpResponse(response));
Não há necessidade de criarBlob
Eu tenho lutado nos últimos dias tentando fazer download de PDFs e imagens, tudo o que consegui fazer foram arquivos de texto simples.
A maioria das perguntas tem os mesmos componentes, mas demorou um pouco para descobrir a ordem certa para que funcionasse.
Obrigado @Nikolay Melnikov, seu comentário / resposta a esta pergunta foi o que fez funcionar.
Em poucas palavras, aqui está minha chamada de back-end do serviço AngularJS:
Do meu controlador:
fonte
Resposta mais recente (para Angular 8+):
fonte
Uma sugestão de código que acabei de usar em meu projeto usando AngularJS v1.7.2
fonte