J'ai une chaîne formatée PDF qui ressemble à
%PDF-1.73 0 obj<<< /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R/Contents 4 0 R>> endobj4 0 obj<> streamx��R=o�0��+��=|vL�R���l�-��ځ,���Ge�JK����{���Y5�����Z˯k�vf�a��`G֢ۢ��Asf�z�ͼ��`%��aI#�!;�t���GD?!���<�����B�b��
...
00000 n 0000000703 00000 n 0000000820 00000 n 0000000926 00000 n 0000001206 00000 n 0000001649 00000 n trailer << /Size 11 /Root 10 0 R /Info 9 0 R >>startxref2015%%EOF
J'essaie d'ouvrir cette chaîne dans une nouvelle fenêtre en tant que fichier PDF. Chaque fois que j'utilise window.open () et que j'écris la chaîne dans le nouvel onglet, il pense que le texte doit être le contenu d'un document HTML. Je veux qu'il reconnaisse qu'il s'agit d'un fichier PDF.
Toute aide est très appréciée
Juste pour information, ce qui suit
window.open("data:application/pdf," + encodeURI(pdfString));
ne fonctionne plus dans Chrome. Hier, je suis tombé sur le même problème et j'ai essayé cette solution, mais cela n'a pas fonctionné (il est "interdit de naviguer dans le cadre supérieur vers l'URL de données"). Vous ne pouvez plus ouvrir l'URL des données directement dans une nouvelle fenêtre. Mais, vous pouvez l'envelopper dans iframe et l'ouvrir dans une nouvelle fenêtre comme ci-dessous. =)
let pdfWindow = window.open("")
pdfWindow.document.write("<iframe width='100%' height='100%' src='data:application/pdf;base64, " + encodeURI(yourDocumentBase64VarHere)+"'></iframe>")
window.open("data:application/pdf," + escape(pdfString));
Celui ci-dessus collant le contenu codé dans l'URL. Cela fait une restriction de la longueur du contenu dans l'URL et donc PDF a échoué (en raison d'un contenu incomplet).
Vous souhaiterez peut-être explorer l'utilisation de l'URI de données. Cela ressemblerait à quelque chose.
window.open("data:application/pdf," + escape(pdfString));
Je n'ai pas été immédiatement en mesure de faire fonctionner cela, possible parce que le formatage de la chaîne binaire fournie. J'utilise également généralement des données encodées en base64 lors de l'utilisation de l'URI de données. Si vous pouvez transmettre le contenu du backend encodé, vous pouvez utiliser ..
window.open("data:application/pdf;base64, " + base64EncodedPDF);
J'espère que c'est la bonne direction pour ce dont vous avez besoin. Notez également que cela ne fonctionnera pas du tout dans IE6/7 car ils ne prennent pas en charge les URI de données.
Je me rends compte que c'est une question assez ancienne, mais j'ai eu la même chose aujourd'hui et j'ai trouvé la solution suivante:
doSomethingToRequestData().then(function(downloadedFile) {
// create a download anchor tag
var downloadLink = document.createElement('a');
downloadLink.target = '_blank';
downloadLink.download = 'name_to_give_saved_file.pdf';
// convert downloaded data to a Blob
var blob = new Blob([downloadedFile.data], { type: 'application/pdf' });
// create an object URL from the Blob
var URL = window.URL || window.webkitURL;
var downloadUrl = URL.createObjectURL(blob);
// set object URL as the anchor's href
downloadLink.href = downloadUrl;
// append the anchor to document body
document.body.appendChild(downloadLink);
// fire a click event on the anchor
downloadLink.click();
// cleanup: remove element and revoke object URL
document.body.removeChild(downloadLink);
URL.revokeObjectURL(downloadUrl);
});
Celui-ci a fonctionné pour moi.
window.open("data:application/octet-stream;charset=utf-16le;base64,"+data64);
Celui-ci a fonctionné aussi
let a = document.createElement("a");
a.href = "data:application/octet-stream;base64,"+data64;
a.download = "documentName.pdf"
a.click();
var byteCharacters = atob(response.data);
var byteNumbers = new Array(byteCharacters.length);
for (var i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var file = new Blob([byteArray], { type: 'application/pdf;base64' });
var fileURL = URL.createObjectURL(file);
window.open(fileURL);
Vous renvoyez une chaîne base64 à partir de l'API ou d'une autre source. Vous pouvez également le télécharger.
Je veux juste ajouter avec la réponse de @Noby Fujioka, Edge ne prendra pas en charge la suite
window.open("data:application/pdf," + encodeURI(pdfString));
Pour Edge, nous devons le convertir en blob et c'est quelque chose comme suit
//If Browser is Edge
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
var byteCharacters = atob(<Your_base64_Report Data>);
var byteNumbers = new Array(byteCharacters.length);
for (var i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var blob = new Blob([byteArray], {
type: 'application/pdf'
});
window.navigator.msSaveOrOpenBlob(blob, "myreport.pdf");
} else {
var pdfWindow = window.open("", '_blank');
pdfWindow.document.write("<iframe width='100%' style='margin: -8px;border: none;' height='100%' src='data:application/pdf;base64, " + encodeURI(<Your_base64_Report Data>) + "'></iframe>");
}
J'ai eu ce problème avec une demande d'expédition FedEx. J'exécute la demande avec AJAX. La réponse comprend le suivi #, le coût, ainsi qu'une chaîne pdf contenant l'étiquette d'expédition.
Voici ce que j'ai fait:
Ajoutez un formulaire:
<form id='getlabel' name='getlabel' action='getlabel.php' method='post' target='_blank'>
<input type='hidden' id='pdf' name='pdf'>
</form>
Utilisez javascript pour remplir la valeur du champ caché avec la chaîne pdf et publier le formulaire.
Où getlabel.php:
<?
header('Content-Type: application/pdf');
header('Content-Length: '.strlen($_POST["pdf"]));
header('Content-Disposition: inline;');
header('Cache-Control: private, max-age=0, must-revalidate');
header('Pragma: public');
print $_POST["pdf"];
?>
Basé sur d'autres anciennes réponses:
escape()
la fonction est désormais obsolète,
Utilisez plutôt encodeURI () ou encodeURIComponent () .
Exemple qui a fonctionné dans ma situation:
window.open("data:application/pdf," + encodeURI(pdfString));
Codage heureux!
Une version mise à jour de la réponse de @ Noby Fujioka :
function showPdfInNewTab(base64Data, fileName) {
let pdfWindow = window.open("");
pdfWindow.document.write("<html<head><title>"+fileName+"</title><style>body{margin: 0px;}iframe{border-width: 0px;}</style></head>");
pdfWindow.document.write("<body><embed width='100%' height='100%' src='data:application/pdf;base64, " + encodeURI(data)+"#toolbar=0&navpanes=0&scrollbar=0'></embed></body></html>");
}
utilisez la fonction "printPreview (binaryPDFData)" pour obtenir la boîte de dialogue d'aperçu avant impression des données pdf binaires.
printPreview = (data, type = 'application/pdf') => {
let blob = null;
blob = this.b64toBlob(data, type);
const blobURL = URL.createObjectURL(blob);
const theWindow = window.open(blobURL);
const theDoc = theWindow.document;
const theScript = document.createElement('script');
function injectThis() {
window.print();
}
theScript.innerHTML = `window.onload = ${injectThis.toString()};`;
theDoc.body.appendChild(theScript);
};
b64toBlob = (content, contentType) => {
contentType = contentType || '';
const sliceSize = 512;
// method which converts base64 to binary
const byteCharacters = window.atob(content);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.Push(byteArray);
}
const blob = new Blob(byteArrays, {
type: contentType
}); // statement which creates the blob
return blob;
};
Une suggestion est d'utiliser une bibliothèque pdf comme PDFJS.
Vous devez ajouter les éléments suivants "data:application/pdf;base64"
+ votre chaîne pdf, et définissez le src de votre élément sur cela.
Essayez avec cet exemple:
var pdfsrc = "data:application/pdf;base64" + "67987yiujkhkyktgiyuyhjhgkhgyi...n"
<pdf-element id="pdfOpen" elevation="5" downloadable src="pdfsrc" ></pdf-element>
J'espère que ça aide :)
pour la dernière version Chrome version, cela fonctionne pour moi:
var win = window.open ("", "Title", "toolbar = no, location = no, directory = no, status = no, menubar = no, scrollbars = yes, resizable = yes, width = 780, height = 200 , haut = "+ (screen.height-400) +", gauche = "+ (screen.width-840)); win.document.body.innerHTML = 'iframe width = "100%" height = "100%" src = "data: application/pdf; base64," + base64 + ">';
// pour la vue pdf
let pdfWindow = window.open("");
pdfWindow.document.write("<iframe width='100%' height='100%' src='data:application/pdf;base64," + data.data +"'></iframe>");