Basic Instincts: 서버 쪽 Word 2007 문서 생성
Basic Instincts
서버 쪽 Word 2007 문서 생성
Ted Pattison

코드 다운로드 위치: BasicInstincts2006_11.exe (170 KB)
Browse the Code Online
지금까지는 Microsoft® Office 응용 프로그램에서 사용되는 문서를 읽고 수정하고 생성하는 서버 쪽 응용 프로그램을 작성하고 배포하는 것이 어려웠습니다. Microsoft Word, Excel® 및 PowerPoint®에서 사용하는 기존 이진 형식은 1997년에 도입된 이후 Office 2003 릴리스까지 기본 파일 형식으로 사용되어 왔습니다. 그러나 이 이진 파일 형식은 작업하기가 매우 까다로웠습니다. Office 문서를 읽고 쓰는 대부분의 프로덕션 응용 프로그램은 호스팅 Office 응용 프로그램의 개체 모델에 따라 이 작업을 수행합니다.
Word 또는 Excel과 같은 응용 프로그램의 개체 모델을 사용하는 응용 프로그램과 구성 요소는 서버 쪽 시나리오에 따라 실행되기보다는 데스크톱에서 더 잘 실행됩니다. 서버에서 안정적으로 동작하는 Office 데스크톱 응용 프로그램을 만드는 데 필요한 추가 인프라 코드를 작성하고 있는 개발자라면 누구나 이것이 좋은 해결 방법이 아니라고 말할 것입니다. 그 이유는 Word 및 Excel과 같은 Office 데스크톱 응용 프로그램이 서버에서 실행되도록 설계된 프로그램이 아닐 뿐만 아니라, 사용자의 조작이 필요한 모달 대화 상자가 나타날 때마다 응용 프로그램을 종료하고 다시 시작하는 사용자 지정 유틸리티 프로그램이 필요하기 때문입니다.
호스팅 Office 응용 프로그램의 개체 모델을 따르지 않고 Office 문서를 읽고 쓸 수 있는 기능은 서버 쪽 시나리오에서 사용하는 것이 더 바람직합니다. Office 2000 및 Office 2003에는 XML을 사용하여 Excel 통합 문서와 Word 문서를 만들 수 있는 몇 가지 간단한 기능이 포함되어 있습니다. 이러한 향상된 기능 덕분에 System.Xml 네임스페이스를 통해 제공되는 Microsoft .NET Framework에 포함된 것과 같은 XML 라이브러리를 사용하여 Office 문서의 일부를 작성할 수 있게 되었습니다.
Microsoft는 2007 Microsoft Office system에 이 아이디어를 적극 반영하여 Office Open XML 파일 형식을 Microsoft Office Word, Excel 및 PowerPoint 2007 문서에 채택했습니다. Office Open XML 파일 형식은 서버에서 Office 데스크톱 응용 프로그램을 실행하는 시스템이 없어도 서버에서 Word 문서, Excel 통합 문서 또는 PowerPoint 프레젠테이션을 읽고, 쓰고, 생성할 수 있게 해 주므로 ASP.NET 및 SharePoint® 개발자에게 호평을 받고 있습니다.
Office Open XML 파일 형식은 공표된 ECMA(European Computer Manufacturers Association) 표준으로 채택될 예정입니다. 현재 진행되고 있는 표준화 프로세스에 대한 자세한 내용을 보려면 openxmldeveloper.com(영문)에서 Office Open XML 파일 형식 사양의 최신 초안을 다운로드하고 기타 유용한 온라인 리소스를 참조하십시오. 이번 달 칼럼에서는 ASP.NET 응용 프로그램 내에서 간단한 Word 문서를 만든 다음 이 문서를 Word 2007에서 직접 열 수 있도록 하는 데 필요한 프로그래밍을 소개합니다.

Word 2007 문서 내부
먼저 Office Open XML 파일 형식을 기반으로 하는 간단한 Word 문서의 구조를 살펴보겠습니다. 그림에서 볼 수 있듯이 Office Open XML 파일 형식은 표준 ZIP 파일 기술을 기반으로 합니다. 각 최상위 파일은 ZIP 압축 파일로 저장됩니다. 즉, Windows® 탐색기에 내장된 ZIP 파일 지원을 사용하여 다른 ZIP 파일과 마찬가지로 Word 문서를 열고 내부를 살펴볼 수 있습니다.
Word 및 Excel과 같은 2007 Microsoft Office system 응용 프로그램에서는 새 형식을 사용하는 문서에 대한 파일 확장명이 추가되었습니다. 예를 들어 .docx 확장명은 Office Open XML 파일 형식으로 저장된 Word 문서에 사용되는 반면, 더 익숙한 .doc 확장명은 이진 형식으로 저장된 Word 문서에 계속 사용됩니다.
지금 설명하는 내용을 확인하려면 Word 2007에서 새 문서를 만든 다음 "Hello Word"라는 텍스트를 추가합니다. 기본 형식을 사용하여 이 문서를 Hello.docx라는 새 파일 이름으로 저장하고 Word를 닫습니다. 그런 다음 Windows 탐색기에서 Hello.docx를 찾아서 Hello.zip으로 이름을 바꿉니다. Hello.zip을 열고 Word 내부적으로 만들어진 폴더와 파일의 구조를 확인합니다(그림 1 참조).
그림 1 DOCX 파일은 ZIP 압축 파일입니다. (더 크게 보려면 이미지를 클릭하십시오.)
최상위 파일(Hello.docx)을 패키지라고 합니다. 패키지는 표준 ZIP 압축 파일로 구현되므로 압축 기능을 자동으로 제공하며 Windows 플랫폼 및 다른 플랫폼에서 다양한 기존 유틸리티 및 API를 사용하여 패키지 콘텐츠에 바로 액세스할 수 있습니다.
패키지 내에는 파트와 항목이라는 두 가지 내부 구성 요소가 있습니다. 일반적으로 파트에는 콘텐츠가 들어 있고 항목에는 파트를 설명하는 메타데이터가 들어 있습니다. 항목은 관계 항목과 콘텐츠 형식 항목으로 구분할 수 있습니다. 파트는 패키지 내부에 유지되는 콘텐츠가 들어 있는 내부 구성 요소입니다. 대부분의 파트는 연관된 XML 스키마를 통해 XML로 serialize된 간단한 텍스트 파일입니다. 그러나 파트는 Word 문서에 그래픽 이미지나 미디어 파일이 들어 있는 경우와 같이 필요에 따라 이진 데이터로 serialize될 수도 있습니다.
파트의 이름은 패키지 파일 내에서의 파트의 상대 경로가 들어 있는 URI(Uniform Resource Identifier)와 파트 파일 이름이 결합되어 만들어집니다. 예를 들어 Word 문서용 패키지의 기본 파트는 /word/document.xml입니다. 다음은 간단한 Word 문서용 패키지에서 일반적으로 볼 수 있는 파트 이름입니다.
  • /[Content_Types].xml
  • /_rels/.rels
  • /docProps/app.xml
  • /docProps/core.xml
  • /word/_rels/document.xml.rels
  • /word/document.xml
  • /word/fontTable.xml
  • /word/settings.xml
  • /word/styles.xml
  • /word/theme/theme1.xml
Office Open XML 파일 형식에서는 관계를 사용하여 원본 파트와 대상 파트 간의 연결을 정의합니다. 패키지 관계는 최상위 패키지와 파트 간의 연결을 정의합니다. 파트 관계는 상위 파트와 하위 파트 간의 연결을 정의합니다. 관계가 중요한 이유는 이를 통해 문제가 되는 파트 내의 콘텐츠를 조사하지 않고도 이러한 연결을 검색할 수 있기 때문입니다. 즉, 관계는 콘텐츠별 스키마에 독립적이기 때문에 보다 빨리 확인할 수 있습니다. 두 파트 중 한 파트를 수정하지 않고도 두 파트 간의 관계를 설정할 수 있다는 점 또한 장점입니다.
관계는 관계 항목이라는 내부 구성 요소에 정의됩니다. 관계 항목은 실제로 파트로 간주되지는 않지만 파트와 마찬가지로 패키지 내에 저장됩니다. 일관성을 위해 관계 항목은 항상 _rels라는 이름의 폴더에 만들어집니다.
예를 들어 패키지에는 /_rels/.rels라는 이름의 패키지 관계 항목이 하나만 들어 있습니다. 패키지 관계 항목에는 다음과 같이 .docx 파일의 최상위 패키지와 내부 파트 /word/document.xml 간의 관계와 같이 패키지 관계를 정의하는 XML 요소가 있습니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="../package/2006/relationships ">
  <Relationship Id="rId1"
      Type="../officeDocument/2006/relationships/officeDocument "
      Target="word/document.xml"/>
</Relationships>

이처럼 Relationship 요소는 이름, 종류 및 대상 파트를 정의합니다. 또한 관계의 종류 이름은 XML 네임스페이스를 만들 때 사용한 것과 동일한 명명 규칙을 사용하여 정의됩니다.
패키지는 단일 패키지 관계 항목뿐만 아니라 하나 이상의 파트 관계 항목을 포함할 수 있습니다. 예를 들어 URI /word/_rels/document.xml.rels에 있는 패키지 관계 항목 내에서 /word/document.xml과 하위 파트 간의 관계를 정의할 경우 파트 관계 항목 내 관계의 Target 특성은 최상위 패키지에 대한 상대 경로가 아닌 상위 파트에 대한 상대 URI입니다.
패키지 내의 모든 파트는 특정 콘텐츠 형식으로 정의됩니다. 콘텐츠 형식은 파트의 미디어 유형, 하위 유형 및 선택적 매개 변수 집합을 정의하는 메타데이터입니다. 패키지에서 사용되는 모든 콘텐츠 형식은 콘텐츠 형식 항목이라는 구성 요소 내에 명시적으로 정의되어야 합니다. 각 패키지에는 /[Content_Types].xml이라는 콘텐츠 형식 항목이 하나만 있습니다. 그림 2에서는 /[Content_Types].xml에 정의된 콘텐츠 형식 정의의 예를 보여 줍니다. 그림을 보면 알 수 있듯이 관계 항목 또한 파트처럼 연결된 콘텐츠 형식을 사용해서 정의됩니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Types xmlns=
  "http://schemas.openxmlformats.org/package/2006/content-types">

  <Default Extension="rels" ContentType=
    "application/vnd.openxmlformats-package.relationships+xml"/>

  <Default Extension="xml" ContentType="application/xml"/>

  <Override PartName="/word/document.xml" 
    ContentType="application/vnd.openxmlformats-
                 officedocument.wordprocessingml.document.main+xml"/>
</Types>
콘텐츠 형식은 패키지의 소비자가 파트의 콘텐츠를 읽고 렌더링하는 방법을 해석하는 데 사용됩니다. 그림 2에서 볼 수 있듯이 기본 콘텐츠 형식은 일반적으로 .rels 또는 .xml과 같은 파일 확장명으로 연결됩니다. 재정의 콘텐츠 형식은 파일 확장명과 연결된 기본 콘텐츠 형식과는 다른 콘텐츠 형식의 특정 파트를 정의하는 데 사용됩니다. 예를 들어 그림 2를 보면 /word/document.xml이 .xml 확장명을 가진 파일에 사용되는 기본 콘텐츠 형식이 아닌 다른 콘텐츠 형식과 연결되어 있습니다.

첫 번째 DOCX 파일 생성
기존의 몇 가지 라이브러리를 사용하여 ZIP 파일을 읽고 쓸 수 있지만 .NET Framework 3.0과 함께 제공되는 WindowsBase.dll 어셈블리에 속해 있는 새 패키징 API가 Office Open XML 파일 형식을 인식할 수 있으므로 되도록이면 새 패키징 API를 사용해야 합니다. 예를 들어 간편하게 관계 요소를 관계 항목에 추가하고 콘텐츠 형식 요소를 콘텐츠 형식 항목에 추가할 수 있는 편리한 방법이 제공됩니다. 패키징 API를 사용하면 이러한 요소와 항목을 직접 다루지 않아도 되므로 간편하게 작업을 수행할 수 있습니다.
이번 달의 코드에서는 WinFX® Runtime Components 2월 CTP(Community Technology Preview)와 함께 설치되는 WindowsBase.dll 버전을 사용합니다. WinFX Runtime Components는 .NET Framework 3.0의 6월 CTP 릴리스로 이름이 바뀌었습니다. 이 두 버전 중 하나를 사용하거나 .NET Framework 3.0의 최신 릴리스를 사용할 수 있습니다. 이 칼럼에서 작성할 코드를 테스트하려면 Word 2007 베타 2 이상을 설치해야 합니다. Office 베타 2에서는 변경된 부분이 있기 때문에 여기에 제시된 코드 중 일부를 수정해야 할 수도 있습니다.
WindowsBase.dll이 포함된 .NET Framework 3.0을 설치한 후에는 그림 3에서와 같이 참조를 추가하여 Visual Studio® 2005 프로젝트에서 패키징 API에 대한 프로그래밍을 시작할 수 있습니다.
그림 3 WindowsBase.dll에 참조 추가 (더 크게 보려면 이미지를 클릭하십시오.)
패키징 API를 구성하는 클래스는 System.IO.Package 네임스페이스에 들어 있습니다. 패키지 작업을 하게 되면 System.IO 네임스페이스 및 System.Xml 네임스페이스에 있는 기존의 익숙한 클래스에 대한 프로그래밍도 자주 수행하게 됩니다. 새 패키지를 만들기 위한 기본 구조를 보여 주는 그림 4의 코드를 살펴보십시오.
Imports System
Imports System.IO
Imports System.IO.Packaging
Imports System.Xml

Class GenerateDOCX

  Shared Sub Main()

    '*** Create a new package 
    Dim pack As Package = Package.Open("c:\Data\Hello.docx", _
                                       FileMode.Create, _
                                       FileAccess.ReadWrite)

    '*** Write code here to create parts and add content

    '*** Close package
    pack.Close()

  End Sub

End Class
System.IO.Packaging 네임스페이스에 Package 클래스가 있고, 이 클래스는 새 패키지를 만들고 기존 패키지를 여는 데 사용하는 Open이라는 공유 메서드를 노출합니다. 파일 I/O를 다루는 다른 클래스와 마찬가지로 Open을 호출할 경우에는 항상 Close도 함께 호출해야 합니다.
새 패키지를 만든 후에는 하나 이상의 파트를 만든 다음 만들어진 파트에 콘텐츠를 serialize하게 됩니다. 이 달의 칼럼에서 제공하는 예제에서는 "Hello World" 응용 프로그램의 지침을 따를 것이므로 \word\document.xml이라는 단일 파트를 만들어야 합니다. 다음과 같이 열려 있는 Package 개체에서 CreatePart 메서드를 호출하고 URI와 문자열 기반 콘텐츠 형식에 대한 매개 변수를 전달하여 파트를 만들 수 있습니다.
'*** Create main document part (document.xml) ...
Dim uri As Uri = New Uri("/word/document.xml", UriKind.Relative)
Dim partContentType As String = "application/vnd.openxmlformats" & _
    "-officedocument.wordprocessingml.document.main+xml"
Dim part As PackagePart = pack.CreatePart(uri, partContentType)

'*** Get stream for document.xml
Dim streamPart As New StreamWriter(part.GetStream(FileMode.Create, _
                                                  FileAccess.Write))
CreatePart를 호출하면 /word/document.xml 경로를 기반으로 하는 URI와 본문이 들어 있는 워드 프로세싱 문서의 파트에 대한 Office Open XML 파일 형식에 필요한 콘텐츠 형식이 전달됩니다. 파트를 만든 다음에는 표준 스트림 기반 프로그래밍 기술을 사용하여 콘텐츠를 파트로 serialize해야 합니다. 방금 본 코드는 GetStream 메서드를 호출하여 파트의 스트림을 열고 결과 Stream 개체를 사용하여 StreamWriter 개체를 초기화합니다.
StreamWriter 개체는 "Hello World" XML 문서를 document.xml로 serialize하는 데 사용됩니다. 다음 XML은 document.xml로 serialize할 수 있는 가장 간단한 XML 문서를 보여 줍니다.
<?xml version="1.0" encoding="utf-8"?>
<w:document xmlns:w=
    "http://schemas.openxmlformats.org/wordprocessingml/2006/3/main"> 
  <w:body>
    <w:p>
      <w:r>
        <w:t>Hello Word 2007</w:t>
      </w:r>
    </w:p>
  </w:body>
</w:document>
이 XML 문서의 모든 요소는 Office Open XML 파일 형식에서 요구하는 대로 schemas.openxmlformats.org/wordprocessingml/2006/3/main 네임스페이스에 정의됩니다. 이 XML 문서에는 상위 문서 요소가 들어 있습니다. 문서 요소 내에는 본문 내용이 들어 있는 body 요소가 있습니다.
body 요소 내에는 각 단락마다 <p> 요소가 있습니다. <p> 요소에는 실행을 정의하는 <r>이 있습니다. 실행은 동일한 특성 집합을 공유하는 요소 영역입니다. 실행에는 텍스트 범위를 정의하는 <t> 요소가 있으며, 이 경우에는 "Hello Word 2007"입니다.
이제 System.Xml 네임스페이스의 XmlDocument 클래스를 사용하는 코드를 통해 이 XML 문서를 생성할 차례입니다. 그림 5에 나와 있는 코드를 보면 적절한 구조 내에서 해당 네임스페이스를 사용하여 이러한 요소를 만드는 방법을 알 수 있습니다. 또한 이 코드에서는 StreamWriter 개체를 사용하여 XML 문서를 스트림에 쓴 다음 스트림을 닫고 serialize된 콘텐츠를 Package 개체에 플러시하는 방법을 보여 줍니다.
'*** Define string variable for Open XML namespace for nsWP:
Dim nsWP As String = &quot;http://schemas.openxmlformats.org&quot; &amp; _
                      &quot;/wordprocessingml/2006/3/main&quot;

'***  Create the start part, set up the nested structure ...
Dim xmlPart As XmlDocument = New XmlDocument()
Dim tagDocument As XmlElement
tagDocument = xmlPart.CreateElement(&quot;w:document&quot;, nsWP)
xmlPart.AppendChild(tagDocument)
Dim tagBody As XmlElement
tagBody = xmlPart.CreateElement(&quot;w:body&quot;, nsWP)
tagDocument.AppendChild(tagBody)
Dim tagParagraph As XmlElement
tagParagraph = xmlPart.CreateElement(&quot;w:p&quot;, nsWP)
tagBody.AppendChild(tagParagraph)
Dim tagRun As XmlElement
tagRun = xmlPart.CreateElement(&quot;w:r&quot;, nsWP)
tagParagraph.AppendChild(tagRun)
Dim tagText As XmlElement
tagText = xmlPart.CreateElement(&quot;w:t&quot;, nsWP)
tagRun.AppendChild(tagText)

'*** Insert text into part as a Text node 
Dim nodeText As XmlNode
nodeText = xmlPart.CreateNode(XmlNodeType.Text, &quot;w:t&quot;, nsWP)
nodeText.Value = &quot;Hello Word 2007&quot;
tagText.AppendChild(nodeText)

'*** Write XML to part and close stream
xmlPart.Save(streamPart)

'*** Close stream and flush XML content into package
streamPart.Close()
pack.Flush()
이제 XML 콘텐츠를 document.xml에 쓰는 작업을 완료했습니다. 마지막으로 Package 개체의 CreateRelationship 메서드를 호출하여 패키지와 document.xml 간의 관계를 생성합니다. 이 작업은 관계 종류에 대한 올바른 문자열 값을 알고 있고 만들고 있는 관계에 대한 고유 이름(예: rId1)을 제시할 수만 있으면 간단하게 수행할 수 있습니다.
'*** Create the relationship part
Dim relationshipType As String = _
    "http://schemas.openxmlformats.org" & _
    "/officeDocument/2006/relationships/officeDocument"
pack.CreateRelationship(uri, TargetMode.Internal, _
    relationshipType, "rId1")
pack.Flush()

'*** Close package
pack.Close()
CreateRelationship 호출 이후 Flush 호출도 살펴봐야 합니다. 이 호출이 실행되면 패키징 API가 적합한 Relationship 요소를 사용하여 패키지 관계 항목을 업데이트합니다. 마지막에 실행되는 Package 개체의 Close 메서드 호출은 패키지 serialization를 완료하고 Hello.docx에 대한 파일 핸들을 해제합니다.
지금까지 Visual Basic® 2005로 작성된 콘솔 응용 프로그램에서 간단한 .docx 파일을 생성하는 모든 단계를 살펴봤으며, 이 모든 단계는 여기(영문)에서 볼 수 있습니다. 이제 ASP.NET 응용 프로그램에서 서버 쪽 .docx 파일을 생성하는 코드를 작성합니다.

서버 쪽 DOCX 파일 생성
웹 서버에서 실행할 콘솔 응용 프로그램의 코드를 수정할 때 가장 먼저 고려해야 할 점은 패키지를 호스트 컴퓨터의 파일 시스템 내에 물리적 파일로 저장하지 않아야 한다는 것입니다. 대신에 ASP.NET 작업자 프로세스 내의 메모리 스트림에서 간단히 패키지를 만드는 것이 훨씬 빠릅니다. 그런 다음 ASP.NET Response 개체의 OutputStream 개체를 사용하여 패키지를 클라이언트에 다시 쓸 수 있습니다.
먼저 물리적 파일 대신 MemoryStream 개체를 사용하도록 코드를 변경하는 작업부터 시작하겠습니다. 그림 6의 코드를 살펴보십시오. 이 코드는 ASP.NET 2.0 페이지 내의 서버 쪽 이벤트 핸들러에 추가되었습니다. Package.Open의 첫 번째 매개 변수가 문자열 기반 파일 경로에서 MemoryStream 개체로 변경되었습니다. 이렇게 하면 앞에서 패키지와 파트를 만들 때 사용했던 코드를 다시 사용할 수 있습니다. 단, OS 수준 파일을 만들거나 이름을 변경하는 것에 대해서는 신경 쓰지 않아도 됩니다. 또한 이 방법을 사용하면 많은 트래픽이 발생하는 시나리오에서 응답 시간을 단축하고 처리량을 높일 수 있습니다.
'*** Create in-memory stream as buffer
Dim bufferStream As New MemoryStream()

'*** Create new package in memory stream
Dim pack As Package = Package.Open( _
  bufferStream, FileMode.Create, FileAccess.ReadWrite)

'*** This calls same code shown in Hello World example
WriteContentToPackage(pack)

'*** Save/close package object leaving DOCX file in MemoryStream
pack.Close()

'*** (1) SET UP HTTP HEADERS FOR RESPONSE
'*** (2) WRITE PACKAGE CONTENT INTO RESPONSE BODY
방금 보았던 코드에서는 MemoryStream 개체를 만든 다음 .docx 파일을 물리적 파일에 serialize하는 것과 동일하게 이 개체에 .docx 파일을 serialize합니다. 사용자 지정 WriteContentToPackage 메서드 내의 코드는 앞에서 살펴본 콘솔 응용 프로그램 내 코드에서 직접 가져왔습니다. 그런 다음 패키지를 만들어서 물리적 파일 대신 메모리의 버퍼에 패키지를 serialize합니다.
패키지를 MemoryStream 개체에 쓰고 패키지 개체의 Close를 호출하면 패키징 API 작업이 완료됩니다. 이제는 적절한 HTTP 헤더를 설정하고 클라이언트에 보낼 응답의 본문에 패키지 콘텐츠를 쓰는 작업만 남았습니다.
먼저 HTTP 헤더부터 시작하겠습니다. 다음과 같이 ASP.NET 응답 개체의 메서드를 호출하여 기존 헤더를 모두 지우고 Hello.docx라는 첨부 파일이 응답에 포함되도록 지정하는 content-disposition 헤더를 추가해야 합니다.
Response.ClearHeaders()
Response.AddHeader("content-disposition", _
                   "attachment; filename=Hello.docx")
그런 다음 HTTP 응답에 대한 인코딩과 MIME 콘텐츠 형식을 설정하고 패키지에 대한 이진 콘텐츠를 HTTP 응답의 본문에 써야 합니다. 이 작업은 그림 7에 있는 코드를 사용하여 수행할 수 있습니다. 전체 패키지가 HTTP 응답에 완벽하게 쓰였는지 확인하려면 마지막 두 호출, 즉 Response.Flush 및 Response.Close 호출을 실행해야 합니다.
Response.ClearContent()
Response.ContentEncoding = System.Text.Encoding.UTF8
Response.ContentType = &quot;application/vnd.ms-word.document.12&quot;

'*** Write package to response stream
bufferStream.Position = 0
Dim writer As New BinaryWriter(Response.OutputStream)
Dim reader As New Bina NO RESPONSE YET | ryReader(bufferStream)
writer.Write(reader.ReadBytes(bufferStream.Length))
reader.Close()
writer.Close()
bufferStream.Close()

'*** flush and close the response object
Response.Flush()
Response.Close()


클라이언트 시스템이 .docx 파일과 연결된 MIME 콘텐츠 형식을 인식할 수 있도록 구성되어 있다면 사용자가 Word 내에서 문서를 열거나 로컬 하드 드라이브에 문서를 저장하는 등의 일반적인 옵션을 사용할 수 있습니다.
그림 8과 같이 사용자가 Open(열기) 단추를 클릭하면 .docx 파일이 Word에서 자동으로 열립니다. 이 시점까지 패키지가 파일 시스템에 물리적 파일로 저장되지 않았다는 점에 주목하십시오. 패키지는 웹 서버와 클라이언트 데스크톱 컴퓨터의 메모리에만 저장되었습니다. 사용자가 문서를 저장하지 않고 닫으면 해당 문서는 존재하지 않았던 것처럼 없어집니다. 바로 이러한 점 때문에 이 방법은 편지, 메모, 고객 목록을 비롯하여 우리가 생각할 수 있는 모든 유형의 문서를 위한 템플릿을 작성하는 데 적합합니다.
그림 8 Word 2007에서 문서 열기 (더 크게 보려면 이미지를 클릭하십시오.)

Ted에게 질문이나 의견이 있으면 다음 전자 메일 주소로 보내시기 바랍니다: instinct@microsoft.com.


Ted Pattison은 저자이자 강사이며 SharePoint 기술에 관한 고급 개발자 교육을 전문적으로 제공하는 회사인 Gorilla Training(GorillaTraining.com)(영문)의 창립자입니다. 또한 Ted는 Microsoft Press의 Inside Windows SharePoint Services 3.0을 저술하고 있습니다.

Page view tracker