使用AngularJS生成服务器端PDF并处理长帖内容。

5

尝试了很多不同的方法,但都没能奏效。

最相似的问题是这个 如何在AngularJS中读取pdf流

我有一个AngularJS应用程序,它向我的PHP文件发送请求以生成PDF文件。 我的控制器具有以下函数,我通过ng-click从按钮调用:

$scope.print = function() {
    $http({
        method : "post",
        url : '/pdf/print_processor.php',
        data : printdata,
        //responseType : 'arraybuffer',
        headers : {
            'Content-type' : 'application/json'
        }
    }).success(function(response, status, headers) {                        
     var file = new Blob([response], {type: 'application/pdf'});
        var fileURL = URL.createObjectURL(file);
        window.open(fileURL);
    });
}   

主要原因是我需要向PHP文件传输更多的数据。printdata变量包含一个嵌套的JSON对象,超过12KB。因此,我不能使用普通的GET方法或将此数据作为URL的一部分通过普通链接传递。
请求正在工作,因为我可以直接调用print_processor.php(这给了我PDF),并且我在创建发送电子邮件时使用相同的方法。与上面提到的问题一样,我的响应也包含PDF本身:
%PDF-1.5
3 0 obj
<</Type /Page
/Parent 1 0 R
/Resources 2 0 R
/Group <</Type /Group /S /Transparency /CS /DeviceRGB>>
/Contents 4 0 R>>
endobj
4 0 obj
<</Filter /FlateDecode /Length 85>>
stream
...

但现在我只想像直接打开PHP文件一样将PDF文件给浏览器...虽然控制器会打开一个带有URL“blob:7e2d358f-00a1-4e33-9e7e-96cfe7c02688”的新窗口,但页面是空的,我认为这个URL对于整个blob来说太短了...
其他一些类似的问题包括: 如何在通过HttpMessageResponse Content发送的javascript中显示服务器端生成的PDF流 AngularJS:从服务器下载pdf文件 如何在angularjs中读取pdf流 AngularJS $http-post - 将二进制转换为Excel文件并下载 当我使用经常提到的responseType "arraybuffer"(在上面的代码中已注释掉)时,PHP的结果是"null"而不是PHP文件的内容。 当它没有被使用时,我得到了PDF文件......也许这是一个提示?!
我的Angular版本是1.2.26。
我尝试的另一个完全不同的解决方案是直接调用PHP(没有ajax / angular控制器),通过使用post方法的表单和一个隐藏字段来传递printdata。 由于printdata是多级嵌套的json对象,因此将其放入隐藏字段中并不是真正可能的事情......
我希望有人有任何其他想法或发现错误!?
1个回答

1

像这样在 $http 中添加 responseType、header 和 cache 参数:

$scope.print = function() {
    $http({
        method : "post",
        url : '/pdf/print_processor.php',
        data : printdata,
        responseType : 'arraybuffer',
        headers: {
                            accept: 'application/pdf'
        },
        cache: true,
    }).success(function(response, status, headers) {                        
     var file = new Blob([response], {type: 'application/pdf'});
        var fileURL = URL.createObjectURL(file);
        window.open(fileURL);
    });
}   

嗨,无法确认这一点,因为太久远了,而且该项目已经不存在了。我无法解释缓存如何解决这个问题?同样适用于接受标头:服务器发送整个响应,因此接受标头有效,我不认为这会改变任何事情。但也许有一天我会尝试一下。谢谢! - Indivon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接