Readonly file 에서 InitScan 실패

문서관리 프로그램을 c# 으로 개발하고 있습니다.
Template file 을 open 하여 필요한 내용을 추가후 SaveAs 하는 방법인데 Template file 을 보호하기 위해 윈도우에서 Readonly mode 로 설정했더니 InitScan 실패가 나오네요. 그래서 Readonly 설정을 그대로 두고 아래한글을 open 후 아래한글에서 ReadOnlyMode 를 false 로 바꾸려고 하니 읽기전용 속성이라 안되는데 방법이 있는지요 ?

안녕하세요.

제가 확인했을 때는 읽기 전용 속성의 문서 파일을 열어도 InitScan 동작이 실패하지 않는데요.

① 관련 코드만를 첨부 부탁드립니다.
② 템플릿 문서를 보호하기 위해 읽기 전용 속성을 설정했다고 하셨는데요.
읽기 전용 속성을 주지 않고 Open 함수에서 arg 속성에 “template:true” 주는 방식은 어떨지 의견 드립니다.

③ ReadOnlyMode 속성 변경은 어떤 API를 이용하셨는지요?
참고로 HwpObject에는 SetEditMode API제공하고 있습니다.

위 가이드로 해보시고 안되시면 다시 문의 코멘트 남겨주세요.
감사합니다.

1개의 좋아요
using HwpObjectLib;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsHwpTest
{
    public partial class Form1 : Form
    {
        private readonly HwpObject hwpApp = new HwpObject();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ExecuteProg();
        }

        private void ExecuteProg()
        {
            Boolean cond;
            dynamic anchorPos;
            dynamic currPos;
            int tableSide = 3;  // 아래쪽
            int tblCount = 0;
            int list, para, pos;
            long ret;
            string cellText;
            string strText;

            try
            {                
                // HwpObject는 오토메이션 모듈로 “HKEY_Current_User\Software\HNC\HwpAutomation\Modules” 에 보안모듈 등록
                // 값 이름:FilePathCheckerModule, 값 데이터:D:\GitHub\ChangeDocs\FilePathCheckerModuleExample.dll
                cond = hwpApp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule");

                if (!cond)
                {
                    MessageBox.Show("아래한글 보안모듈 처리에 문제가 있습니다 !");

                    return;
                }

                hwpApp.Open(@"D:\GitHub\DocManager\bin\x86\Debug\Template\CS300-DS071-프로그램정의서().hwp", "", "");

                IDHwpCtrlCode ctrl = hwpApp.HeadCtrl;
                
                while (ctrl != null)
                {
                    putMsg($"Control char:'{ctrl.CtrlCh}', Control ID:'{ctrl.CtrlID}', User Desc:'{ctrl.UserDesc}'");

                    if (ctrl.CtrlID.Equals("tbl"))
                    {
                        tblCount++;

                        // 표의 다음 pos 를 구함
                        anchorPos = ctrl.GetAnchorPos(0);
                        dispPos(anchorPos);

                        // 구한 pos 로 이동(표의 다음위치)
                        hwpApp.SetPosBySet(anchorPos);          

                        // 개체선택 역방향
                        hwpApp.Run("SelectCtrlReverse");
                        hwpApp.Run("Copy");

                        // 테이블 선택상태에서 첫 번째 셀 선택하기
                        hwpApp.Run("ShapeObjTableSelCell");

                        putMsg($"{tblCount} 번째 표의 첫번째 cell");
                        cellText = readCellText();

                        // putMsg("표의 두번째 cell");
                        // hwpApp.Run("TableRightCell");
                        // cellText = readText();

                        if (cellText.StartsWith("업무명"))
                        {
                            // hwpApp.Run("TableRightCell");
                            hwpApp.Run("TableLowerCell");
                            hwpApp.HAction.GetDefault("InsertText", hwpApp.HParameterSet.HInsertText.HSet);
                            hwpApp.HParameterSet.HInsertText.Text = "Test";
                            hwpApp.HAction.Execute("InsertText", hwpApp.HParameterSet.HInsertText.HSet);

                            hwpApp.HAction.GetDefault("TableInsertRowColumn", hwpApp.HParameterSet.HTableInsertLine.HSet);
                            hwpApp.HParameterSet.HTableInsertLine.Side = 3;
                            hwpApp.HParameterSet.HTableInsertLine.Count = 1;
                            hwpApp.HAction.Execute("TableInsertRowColumn", hwpApp.HParameterSet.HTableInsertLine.HSet);

                        }
                        else if (cellText.Equals("프로그램ID"))
                        {
                            hwpApp.Run("TableRightCell");

                            hwpApp.HAction.GetDefault("InsertText", hwpApp.HParameterSet.HInsertText.HSet);
                            hwpApp.HParameterSet.HInsertText.Text = "Test";
                            hwpApp.HAction.Execute("InsertText", hwpApp.HParameterSet.HInsertText.HSet);
                        }
                    }

                    ctrl = ctrl.Next;
                }

                hwpApp.SaveAs(@"D:\01_프로젝트\43_보고서\11_산출물생성본\Test.hwp", "", "");
                hwpApp.Quit();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private string readCellText()
        {
            string strText = "";
            Boolean cond = false;
            int ret = 0;

            // 셀로 이동 후 InitScan 해줘야함
            cond = hwpApp.InitScan(0x07, 0x00ff, 0, 0, 0, 0);

            if (!cond) 
            {
                putMsg("InitScan 실패 !");
            }

            ret = hwpApp.GetText(out strText);
            putMsg($"Return:'{ret}', Value:'{strText}'");

            // InitScan 후 반드시 ReleaseScan 해줘야함
            hwpApp.ReleaseScan();

            return strText;
        }

        private void putMsg(string msg)
        {
            textBox1.AppendText(msg + "\r\n");
        }

        private void dispPos(dynamic anchorPos)
        {
            putMsg($"list:'{anchorPos.Item("List")}', para:'{anchorPos.Item("Para")}', pos:'{anchorPos.Item("Pos")}'");
        }

        private void CurrPos(int list, int para, int pos)
        {
            putMsg($"list:'{list}', pra:'{para}', pos:'{pos}'");
        }
    }
}

위 코드에서 input file 의 읽기전용 속성을 설정하면 InitScan 이 실패하는데 왜 그런지 도움 부탁 드립니다.
감사 합니다.

원인은 InitScan의 range 인자값 때문입니다.
블록 범위 내에서 scan을 하기 위해 0x00ff 주신 것 같은데
해당 코드는 아래 셀 블럭이 되었을 때만 가능한데 문서의 상태가 읽기 전용 모드이면
셀 블럭이 되지가 않아 InitScan이 실패한 것입니다. :anxious_face_with_sweat:

// 테이블 선택상태에서 첫 번째 셀 선택하기
hwpApp.Run("ShapeObjTableSelCell");

문서 내의 표를 이동하는 방식을 문서 탐색(InitScan)을 통해 구현하신 것 같은데요.
보통 기안문이나 리포트 문서를 생성하는 기능을 구현할 때 템플릿 문서 내에 필드명을 주어
표를 핸들링하는 방법을 사용하고 있으니 참고 부탁드립니다.

감사합니다.