3

我正在尝试通过从后端将 PDF 转换为二进制字符串来显示 PDF。这是我正在进行的 ajax 调用

    $.ajax({
        type : 'GET',
        url : '<url>',          
        data : oParameters,
        contentType : 'application/pdf;charset=UTF-8',
        success : function(odata) {

            window.open("data:application/pdf;charset=utf-8," + escape(odata));

} });

当我尝试在新窗口中打开 PDF 时,网址看起来像

数据:应用程序/pdf;charset=utf-8,%25PDF-1.3%0D%0A%25%uFFFD%uFFFD%uFFFD%uFFFD%0D%0A2%200%20obj%0D%0A/WinAnsiEncoding%0D.... ……

如您所见,它使用“WinAnsiEncoding”来显示 PDF。因此,某些字符无法正确显示。如何将其更改为 UTF-8?

编辑:后端在 ABAP 中。我正在将智能表单转换为 OTF,然后使用功能模块“CONVERT_OTF”转换为字符串。

           CALL FUNCTION fname
         EXPORTING
           user_settings      = space
           control_parameters = ls_ctropt
           output_options     = ls_output
           gv_lang            = lv_lang
         IMPORTING
           job_output_info    = ls_body_text
         EXCEPTIONS
           formatting_error   = 1
           internal_error     = 2
           send_error         = 3
           user_canceled      = 4
           OTHERS             = 5.

CALL FUNCTION 'CONVERT_OTF'
          EXPORTING
             format                = 'PDF' 
          IMPORTING
           bin_filesize          = ls_pdf_len
           bin_file              = ls_pdf_xstring
          TABLES
             otf                   = ls_body_text-otfdata
             lines                 = lt_lines
           EXCEPTIONS
             err_max_linewidth     = 1
             err_format            = 2
             err_conv_not_possible = 3
             err_bad_otf           = 4
             OTHERS                = 5.
   CALL METHOD server->response->set_header_field( name = 'Content-Type'
     value = 'application/pdf;charset=UTF-8' ).
   CALL METHOD server->response->append_data( data = lv_pdf_string
     length = lv_len ).
4

1 回答 1

4

关于您使用“WinAnsiEncoding”显示 PDF的评论:

在逗号之后

data:application/pdf;charset=utf-8,%25PDF-1.3%0D%0A%25%uFFFD%uFFFD%uFFFD%uFFFD%0D%0A2%200%20obj%0D%0A/WinAnsiEncoding%0D........

一切都是纯数据。因此,“WinAnsiEncoding”只是PDF的一部分内容,如果是你的麻烦,必须要求PDF生成器改变他的PDF生成过程。

在手头的情况下,您的数据是:

%PDF-1.3
%...
2 0 obj
/WinAnsiEncoding
........

这是完全正常的PDF结构。它仅意味着 PDF 对象 2 被定义为/WinAnsiEncoding可能用于或不用于某些字体定义,即使使用它,它仍可能被某些/Differences调整以包含您需要的字符。此外,将其更改为 UTF-8(根据您的要求)是没有意义的,因为 UTF-8 不是 PDF 页面内容的标准编码。如果您以某种方式放在UTF-8那里,您将更加破坏 PDF。

不过,我担心还有其他问题。

  1. 您将字符集参数添加到类型application/pdf --- 这没有意义,PDF 是二进制格式,即需要一个字节序列,因此不涉及字符集。

  2. 您的方法调用escape(odata)创建%uFFFD%uFFFD%uFFFD%uFFFD ---根据仅定义的 RFC,这是无效的

    当八位位组的相应字符超出允许的集合或用作组件的分隔符或组件内时,百分比编码机制用于表示组件中的数据八位位组。百分比编码的八位位组被编码为一个字符三元组,由百分比字符“%”后跟表示该八位位组数值的两个十六进制数字组成。

    RFC 3986,第 2.1 节)

    因为百分比 ("%") 字符用作百分比编码八位位组的指示符,所以它必须以百分比编码为 "%25",才能将该八位位组用作 URI 中的数据。

    同上,第 2.4 节)

    因此,%uFFFD%uFFFD%uFFFD%uFFFD无效。

  3. PDF 作为二进制格式更适合 Base64 编码,即

    data:application/pdf;base64,BASE_64_ENCODED_PDF
    

    因此,我建议您相应地更改您的客户端流程。

于 2013-04-16T22:24:46.577 回答