문서관리 프로그램을 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이 실패한 것입니다.
// 테이블 선택상태에서 첫 번째 셀 선택하기
hwpApp.Run("ShapeObjTableSelCell");
문서 내의 표를 이동하는 방식을 문서 탐색(InitScan)을 통해 구현하신 것 같은데요.
보통 기안문이나 리포트 문서를 생성하는 기능을 구현할 때 템플릿 문서 내에 필드명을 주어
표를 핸들링하는 방법을 사용하고 있으니 참고 부탁드립니다.
감사합니다.