PDF Javascript Blob中的非UTF-8字符

问题描述 投票:2回答:1

我有一个PDF文件,我从Web Api 2应用程序提供给AngularJS客户端。我使用file-saver然后将文件保存在客户端上,如下所示(在TypeScript中):

   this.$http.get(`${webUrl}api/pdf?id=${fileDto.id}`)
    .then((response: ng.IHttpPromiseCallbackArg<any>) => {
        var file = new Blob([response.data], { type: 'application/pdf' });
        saveAs(file, 'my.pdf');
    });

我这样做的原因是我可以使用持票人令牌来授权访问PDF(这是通过拦截器添加的)。这适用于PDF文件包含非UTF8字符的情况。在后一种情况下,文件仍然会下载,但是当我打开它时,它显示为空白。打开文件我可以看到非UTF8字符被替换为□字符。在JavaScript中,当我在调试器中检查response.data的字符串值时,我看到这些字符由represented表示。我是否正确地假设,因为文件是用JavaScript中的字符串编写的,无论我做什么,我都无法正确保存来自JavaScript的非UTF8字符的文件?

angularjs pdf utf-8 blob angularjs-http
1个回答
6
投票

字符是Unicode Replacement Character \uFFFD,它在尝试解析非法UTF-8时由UTF-8解析器插入。

PDF文件不是UTF-8字符串;它们是二进制文件。

要避免从UTF-8到DOMstring(UTF-16)的转换,请将config设置为responseType: 'blob'

   var config = {responseType: 'blob'};

   this.$http.get(`${webUrl}api/pdf?id=${fileDto.id}`, config)
     .then((response: ng.IHttpPromiseCallbackArg<any>) => {
       ̶v̶a̶r̶ ̶f̶i̶l̶e̶ ̶=̶ ̶n̶e̶w̶ ̶B̶l̶o̶b̶(̶[̶r̶e̶s̶p̶o̶n̶s̶e̶.̶d̶a̶t̶a̶]̶,̶ ̶{̶ ̶t̶y̶p̶e̶:̶ ̶'̶a̶p̶p̶l̶i̶c̶a̶t̶i̶o̶n̶/̶p̶d̶f̶'̶ ̶}̶)̶;            
       var file = response.data;
       saveAs(file, 'my.pdf');
   });

有关更多信息,请参阅

© www.soinside.com 2019 - 2024. All rights reserved.