2013-04-16 70 views
3

我試圖通過將其轉換爲來自後端的二進制字符串來顯示PDF。 這是Ajax調用我正在在PDF中顯示UTF-8字符

$.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). 
+0

向我們展示創建此PDF數據的服務器端代碼。 – Bergi

+0

您是否檢查過正在執行ABAP程序的用戶在其首選項中設置了正確的登錄語言? – vwegert

+0

我將一個語言參數傳遞給正在生成PDF的smartform。問題在於像日文這樣的必須使用「UTF-8」編碼的語言,否則它就可以正常工作。謝謝。 – Themasterhimself

回答

3

關於你的話是它使用 「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不是用於PDF頁面內容的標準編碼,所以將其更改爲UTF-8(根據您的要求),對於沒有意義。如果您不知何故將UTF-8放在那裏,您將會更多地分解PDF。

雖然我恐怕還有其他問題。

  1. 你一個字符集參數添加到類型應用程序/ PDF ---這是沒有意義的,PDF是一種二進制格式,即字節序列預期,因此,沒有字符集參與。

  2. 你的方法調用escape(odata)創建%uFFFD%uFFFD%uFFFD%uFFFD ---根據僅限定

    A-百分號編碼機制被用於表示一個數據的RFC這是無效的當八位字節的相應字符超出允許設置的範圍或被用作組件的分隔符或位於組件內時,該組件的八位字節。編碼百分比的八位字節被編碼爲字符三元組,由百分號字符「%」組成,後跟兩個表示該八位字節數值的十六進制數字。

    RFC 3986,第2.1節)

    因爲百分比(「%」)字符用作百分比編碼八比特組指示,它必須被百分比編碼爲「%25」對於一個八位位組被用作URI內的數據。

    ibidem,第2.4節)

    因此,%uFFFD%uFFFD%uFFFD%uFFFD是無效的。

  3. PDF是一個二進制格式更適合Base64編碼,即

    data:application/pdf;base64,BASE_64_ENCODED_PDF 
    

    因此,我建議你進行相應的更改客戶端的過程。