在PDF中显示UTF-8字符

时间:2013-04-16 15:20:00

标签: javascript pdf utf-8 character-encoding sap

我试图通过从后端将其转换为二进制字符串来显示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;字符集= 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中。我正在使用功能模块“CONVERT_OTF”将smartform转换为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 ).

1 个答案:

答案 0 :(得分:3)

关于你的评论它使用&#34; WinAnsiEncoding&#34;显示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........

一切都是纯数据。因此,&#34; WinAnsiEncoding&#34;仅仅是PDF内容的一部分,如果是您遇到麻烦的原因,则必须要求PDF生成器更改其PDF生成过程。

在目前的情况下,您的数据是:

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

这是完全正常的PDF结构。它仅仅意味着PDF对象2被定义为/WinAnsiEncoding,可能会或可能不会用于某些字体定义,即使使用它,它仍然可以通过一些 /差异包括您需要的字符。此外,将其更改为UTF-8 (按照您的要求)没有意义,因为UTF-8不是PDF页面内容的标准编码。如果你以某种方式将UTF-8放在那里,那么你将更加打破PDF。

但是,我害怕,还有其他问题。

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

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

      

    百分比编码机制用于表示当该八位位组的对应字符在允许的集合之外或者被用作该组件的分隔符或在该组件内时的组件中的数据八位字节。百分比编码的八位字节被编码为字符三元组,由百分比字符&#34;%&#34;后跟两个十六进制数字,表示该八位字节的数值。

         

    RFC 3986,第2.1节)

         

    因为百分比(&#34;%&#34;)字符用作百分比编码八位字节的指示符,所以它必须被百分比编码为&#34;%25&#34;将该八位字节用作URI中的数据。

         

    ibidem,第2.4节)

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

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

    data:application/pdf;base64,BASE_64_ENCODED_PDF
    

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