ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WPF에서 DevExpress의 RichEditControl에서 작업한 데이터를 Spire.Doc을 통해서 문서 파일로 변환 할 때 일어나는 현상 및 해결 방법
    닷넷 2024. 8. 28. 17:38
    반응형

    DevExpress에서는 MS의 워드 프로그램에서 작업하는 것처럼 본인이 WPF로 만드는 프로그램에서도 비슷한 작업을 할 수 있게 해주는 기능을 제공한다.

    RichEditControl을 사용하면 되는 것.

    사실 RichEditControl을 통해서 내용을 바로 문서 파일로 저장할 수 있기 때문에 RichEditControl을 통해서만 텍스트 편집 작업을 하면 Spire.Doc과 같은 문서 작업 전용 라이브러리는 필요 없다.

    그러나 내가 현재 유지보수 중인 프로그램은 여러 화면에서 작업한 내용을 취합해서 하나의 문서 파일로 만들어 내어야 한다. 문서 파일은 워드 뿐만 아니라 파워포인트, 엑셀, PDF 등일 수 있다.

    그렇게 상용 라이브러리 중에서 Spire.Doc을 사용 중이다.

     

    문제 발견

    이때 내용은 단순 문자열로 되어 있으면 문제가 되지 않는다.

    데이터가 HTML로 되어 있을 때 문제가 된다.

    RichEditControl에서 반환되는 HTML 데이터 htmlContent

    paragraph.AppendHTML(htmlContent); 와 같이 Spire.Doc에서 사용을 하면 스타일 변경이 제대로 되지 않는 문제들이 있다.

     

    해결 방법

    스타일 적용이 제대로 안 되는 경우는 글머리 기호나 번호 매기기를 한 경우였다.

    처음에는 어떻게 해결해야 할지 아이디어가 떠오르지 않아서 정말 단순하게 접근하여 일부 하드코딩하며 HTML 데이터의 스타일에서 margin의 값을 문자열 파싱했다.

    바로 될 줄 알았는데, ol 태그가 두번 반복되는 경우에는 잘 안 되었다.

    그러다 떠오른 것!

    RichEditControl을 통해서 파일로 저장한 것은 서식 스타일이 틀어지지 않음을 확인하고, 이것을 활용하면 되겠구나 생각했다.

     

    private void ParsingHtml(string html, Section section)
    {
        string path = Util.TempPath;
        string fileName = $"Temp_{Util.NewKey()}.docx";
        string filePath = Path.Combine(path, fileName);
    
        // RichEditControl에서 작업된 데이터는 워드파일로 임시 저장한다.
        var control = new DevExpress.Xpf.RichEdit.RichEditControl();
        control.HtmlText = html;
        control.SaveDocument(filePath, DocumentFormat.OpenXml);
    
        // 방금 저장된 워드파일을 Spire.Doc을 통해서 가져온다.
        var doc = new Document();
        doc.LoadFromFile(filePath);
    
        using (MemoryStream htmlStream = new MemoryStream())
        {
            // 문서 내용을 HTML로 변환
            doc.SaveToStream(htmlStream, FileFormat.Html);
            
            htmlStream.Position = 0;
    
            StreamReader reader = new StreamReader(htmlStream);
            string htmlContent = reader.ReadToEnd();
    
            // HTML을 새 단락으로 추가
            Paragraph newParagraph = section.AddParagraph();
            newParagraph.AppendHTML(htmlContent);
        }
        
        // 임시 저장한 워드파일 삭제
        Util.RemoveFile(path, fileName);
    }

    이렇게 코딩을 하여 사용 하니 스타일이 틀어지는 것 하나 없이 잘 변환 된다.

    여기서 더 수정할 게 있을까 고민해 보았지만 이것이 최선인 것 같다.

    반응형

    '닷넷' 카테고리의 다른 글

    닷넷 개발자 로드맵 2024 (.NET Developer Roadmap 2024.)  (0) 2024.01.03

    댓글

Designed by Tistory.