2012-06-01 2 views
1

데이터베이스에서 워드 문서를 동적으로 생성하려고합니다 (쿼리 처리를 위해 CFC를 사용하고 있습니다). 내 노력은 성공적 이었지만 영어로만 문서를 재현 할 수있었습니다. 그러나, 내 응용 프로그램은 그리스어를 사용합니다.ColdFusion, MS Word 문서 및 그리스어 문자

그리스어 문자가 포함 된 문서를 만들 때 출력은 다음과 같습니다 : ??????????????????. 나는 많은 것을 시도했지만 아무것도 작동하지 않습니다. 여기서 이상한 점은 PDF 재생을 위해 동일한 CFC를 사용할 때 그리스 문자가 올바르게 출력된다는 것입니다.

CFM 파일 :

<cfheader name="Content-Disposition" value="inline; filename=Save-Print.doc" charset="utf-8"> 
<cfcontent type="application/msword"> 

<html xmlns:o="urn:schemas-microsoft-com:office:office" 
     xmlns:w="urn:schemas-microsoft-com:office:word" 
     xmlns="http://www.w3.org/TR/REC-html40"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Print</title> 
<!--[if gte mso 9]> 
<xml> 
<w:WordDocument> 
<w:View>Print</w:View> 
<w:Compatibility> 
<w:UseAsianBreakRules/> 
</w:Compatibility> 
<w:Zoom>100</w:Zoom> 
<w:DoNotOptimizeForBrowser/> 
</w:WordDocument> 
</xml> 
<![endif]--> 

<!--[if supportFields]> 
<div style="mso-element:header" id="lala"> 
<p class=MsoHeader><span style="color:red"> 
<![endif]--> 
<style> 
<!-- 
@page Section1 
{ 
size:8.5in 11.0in; 
margin:1.0in 1.25in 1.0in 1.25in; 
mso-header-margin:.5in; 
mso-footer-margin:.5in; 
mso-paper-source:0; 
mso-header:url("http://localhost:8500/BookLedger_Final/resources/cfScripts/Header.html") h1; 
mso-footer:url("http://localhost:8500/BookLedger_Final/resources/cfScripts/Header.html") f1; 
} 
div.Section1 {page:Section1;} 
p.MsoHeader { 
border-bottom-width: 1px; 
border-bottom-style: solid; 
border-bottom-color: #333; 
} 
p.MsoFooter { 
} 
--> 
</style> 
</head> 

<body> 

<cfif not IsDefined("URL.id")> 
     <cfelseif not IsDefined("URL.model")> 
</cfif> 

    <!--- Get print details ---> 
    <cfinvoke 
    component="Print" 
    method="myPrint" 
    returnvariable="getMember" 
    id="#URL.id#" 
    model="#URL.model#"> 


    <div class=Section1> 

     <cfoutput query="getMember"> 
     <b id="lala">#Title#</b> 
     <p style="color:##1c1c1c"><i>#Body#</i></p> 
     </cfoutput>  

    </div> 


</body> 
</html> 

연합사 파일 :

<cfcomponent> 

    <cffunction name="myPrint" access="remote" returntype="query" output="no"> 

     <cfargument name="id" default="0" required="false" type="numeric"> 
     <cfargument name="model" default="" required="false" type="any"> 
     <cfset model = #ARGUMENTS.model#> 

     <cfif model EQ "member"> 

     <cfquery name="getMember" datasource="rental">    
      SELECT CONCAT(rental.members.firstname,' ',rental.members.lastname) AS 'Title',rental.members.biog AS 'Body' 
      FROM rental.members 
      WHERE rental.members.id = #ARGUMENTS.id# 
      AND rental.members.model = "#ARGUMENTS.model#" 
     </cfquery> 


     <!---<cfset queryToString = serializeJson(getMember)> 
     <cfset strippedQuery = REReplace(queryToString,'<[^>]*>','','all')>---> 

     <cfreturn getMember> 



     <cfelseif model EQ "new_member"> 

     <cfquery name="getMember" datasource="rental">    
      SELECT CONCAT(rental.new_members.firstname,' ',rental.new_members.lastname) AS 'Title',rental.new_members.biog AS 'Body' 
      FROM rental.new_members 
      WHERE rental.new_members.id = #ARGUMENTS.id# 
      AND rental.new_members.model = "#ARGUMENTS.model#" 
     </cfquery> 

     <cfreturn getMember> 


     <cfelseif model EQ "book"> 

     <cfquery name="getMember" datasource="rental">    
      SELECT rental.books.title AS 'Title',rental.books.description AS 'Body' 
      FROM rental.books 
      WHERE rental.books.id = #ARGUMENTS.id# 
      AND rental.books.model = "#ARGUMENTS.model#" 
     </cfquery> 

     <cfreturn getMember> 


     <cfelseif model EQ "journal"> 

     <cfquery name="getMember" datasource="rental">    
      SELECT rental.journals.title AS 'Title',rental.journals.description AS 'Body' 
      FROM rental.journals 
      WHERE rental.journals.id = #ARGUMENTS.id# 
      AND rental.journals.model = "#ARGUMENTS.model#" 
     </cfquery> 

     <cfreturn getMember> 


     <cfelseif model EQ "cd"> 

     <cfquery name="getMember" datasource="rental">    
      SELECT rental.cd.title AS 'Title',rental.cd.description AS 'Body' 
      FROM rental.cd 
      WHERE rental.cd.id = #ARGUMENTS.id# 
      AND rental.cd.model = "#ARGUMENTS.model#" 
     </cfquery> 

     <cfreturn getMember> 

     </cfif> 

    </cffunction> 

</cfcomponent> 
+0

값을 html로 출력하면 올바르게 표시됩니까? 그렇지 않다면 a) 유니 코드로 저장된 데이터, 즉'nvarchar '입니까? b) 데이터 소스 설정 (및 db 유형)은 무엇입니까? – Leigh

+0

다음 나는 다음을 시도 : [링크] http://pastebin.com/M5Q9P0rd 위의 코드로 영어 문자 만 출력되었습니다. 다음 행을 주석으로 처리합니다. [코드] [/ code] 모든 것이 잘 작동합니다. 나는 Railo에서도 그것을 시도했다. 위의 코드는 1 행 (그리스 문자)을 쿼리 할 때만 잘 작동합니다! 나는 무슨 일이 일어나는지 알 수 없다. 어떤 아이디어라도 환영합니다. 미리 감사드립니다. 톰, 그리스 – anarchos78

+0

어떻게 문자를 저장하고 있습니까? 열 데이터 형식, 데이터 정렬 및 db 형식은 무엇입니까? – Leigh

답변

1

내가 당신의 pastebin 예제를 시도했을 때 나는 너무 횡설수설했습니다. utf-8을 지정하는 <meta> 태그를 삭제 한 것 같습니다. 다시 추가 할 때 MS Word에서 문자가 제대로 표시됩니다.

<cfprocessingdirective pageencoding="utf-8"> 
<cfheader name="Content-Disposition" value="inline; filename=Save-Print.doc" charset="utf-8"> 
<cfcontent type="application/msword; charset=utf-8"> 
<html xmlns:o="urn:schemas-microsoft-com:office:office" 
     xmlns:w="urn:schemas-microsoft-com:office:word" 
     xmlns="http://www.w3.org/TR/REC-html40"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<title>Print</title> 
... 
+0

대단히 감사합니다. 위의 이유가 무엇인지 설명 할 수 있습니까? 나는 단지 해결책을 원하지만 설명도 원하지 않는다. 이런 식으로 나는 배울 기회가있다. 다시 한번 고마워요. 내 친구 – anarchos78

+1

분명히 사물의 조합입니다.하지만 중요한 차이점은' 태그를 추가하는 것입니다. html로. 이를 생략하면 MS Word는 기본값 인'windows-1252'를 가장 많이 사용합니다. – Leigh

+0

다시 한 번 감사드립니다. – anarchos78

0

매우 문자 집합 문제 같은데. 이 기사 http://www.joelonsoftware.com/articles/Unicode.html을 통해 읽어 보면 훌륭한 일을 설명 할 수 있습니다. 이 경우에도 모든 것을 utf-8로 설정할 수있는 길이가되어 DB에서 얻은 정보가 유니 코드가 아닌 그리스 코드 페이지로 표시됩니다. 실험으로 cfheader의 charset 및 태그를 ISO-8859-7 또는 Windows-1253으로 설정할 수 있습니다. 그러면 콘텐츠가 올바르게 표시 될 수 있습니다. 또한 IE에서 문서를 열어 문서를 열 수도 있습니다. 보기 -> 인코딩 메뉴를 사용하면 실제로 사용중인 것을 보여줄 수있는 문서를 렌더링하기 위해 IE가 사용하는 인코딩을 변경할 수 있습니다.

태그를 주석 처리하면 브라우저가 컨텐츠 유형을 결정하게하고 그리스 문자 세트 중 하나가 될 가능성이 높습니다. fiddler을 사용하여 CF의 응답을 캡처하고 조사 할 수도 있습니다. 그리스 문자가 실제로 utf-8로 인코딩 된 경우 1 바이트 이상을 차지하지만 그리스 문자 코드를 사용하는 경우 1 바이트 만 차지합니다. 피들러의 응답 탭에서 16 진수보기를 사용하면 꽤 빨리이 사실을 알 수 있습니다.

다른 옵션은 '실제'word .doc 또는 .docx 파일을 생성하기 위해 Apache POI와 같은 것을 사용하는 것일 수 있습니다. 그것은 일의 덩어리지만 우리는 내가 일하는 곳에서 좋은 효과를 내기 위해 그것을 사용합니다.

+0

답장을 보내 주셔서 감사합니다. 문제는 데이터베이스에 없습니다. 링크 [http : // pastebin]를 따르는 경우.co.kr/M5Q9P0rd 당신은 데이터를 인라인으로 배치 한 것을 볼 수 있습니다. 같은 문제가 발생합니다. (즉, doc 형식으로 컨텐츠를 제공하지 않음을 의미)를 제거하면 모든 것이 브라우저에 올바르게 표시됩니다. 하지만 나는 브라우저에 콘텐츠를 표시하고 싶지 않습니다. 사용자가 문서로 다운로드하길 원합니다. – anarchos78

+0

나는 보내지는 것을 100 % 확실하게하기 위해 피들러 (fiddler) 또는 wireshark를 통해 원시 캡쳐 (raw capture)를 살펴볼 것입니다. 또한 HTML을 생성 한 다음 .doc 확장자를 제공하고 content-type을 사용하여 단어를 강제로 열 수 있습니다. Word가 HTML을 해석하기 위해 선택하는 방법을 자비로 생각합니다. HTML은 현명한 방법 일 수도 있고 그렇지 않을 수도 있습니다. 각 문자를 유니 코드 문자 엔티티 참조로 변환 해보고 단어가 올바르게 처리되는지 확인할 수 있습니다. – barnyr