안녕하세요?
c#으로 아래한글 오토메이션 하고 있습니다.
한글의 문서 1에서 일부 내용을 복사해서
새 탭을 열어서 문서 2에 붙여넣기 하고 있습니다.
단순하게 블럭 설정 후
hwp.Run(“Copy”);
새 문서 탭에서
hwp.Run(“Paste”);
해서 붙여넣기 하고 있습니다. 큰 문제는 없었는데…
오토메이션으로 오래걸리는 작업을 하는동안
윈도우에서 다른 작업을 할때 복사/붙여넣기를 하다보면 저도모르게 Ctrl-C, Ctrl-V 사용하다보니
아래한글에서 복사된 내용이 붙여넣기 되어서요
복사/붙여넣기가 윈도우의 공용 메모리를 사용하는것 같은데
hwp.Run(“Copy”);
hwp.Run(“Paste”);
대신에
변수에 저장해서 읽고 쓰고 할수 있는 방법이 있을까요?
stream 을 이용한다던지…
조언 주시면 고맙겠습니다.
감사합니다.
1개의 좋아요
안녕하세요.
클립보드 메모리를 사용하지 않고 선택한 영역의 데이터를 가져오고, 지정할 수 있는 API가 있습니다.
Object data = hwp.GetTextFile("HWP", "savablock");
...
hwp.SetTextFile(data, "HWP", "insertfile");
감사합니다.
1개의 좋아요
감사합니다… 원하는대로 잘 되는거 같아요
바로 답변 주셨는데 다른거 한다고 확인을 늦게 했네요
감사합니다.
2개의 좋아요
일반적인 상황에서는 잘 됐었는데요
선택 영역 이전에 조판부호가 있을때 선택영역 이전의 조판부호가 같이 복사가 됩니다
![image](https://global.discourse-cdn.com/business6/uploads/hancom_dev_forum/original/2X/c/cc97b54897ecbb44a62a8e8ffa2a95af618c1267.png)
위 그림처럼 첫줄에 조판부호가 있을때
분명히 두번째 줄 시작부터 선택되어 있는데
변수를 활용하여 복사/붙여넣기 했을때는
![image](https://global.discourse-cdn.com/business6/uploads/hancom_dev_forum/original/2X/6/63efd78a63cb9a59168fb6b62ee2f0a367a5ba24.png)
위 그림처럼 윗줄의 조판부호까지 같이 복사가 되는데 뭐가 문제일까요?
코드는 아래와 같습니다.
hwp.Run("MoveDocBegin");
hwp.Run("MoveDown");
hwp.Run("Select");
hwp.Run("MoveDocEnd");
MessageBox.Show("선택 영역 확인");
object block = hwp.GetTextFile("HWP", "savablock");
hwp.Run("FileNewTab");
hwp.SetTextFile(block, "HWP", "insertfile");
같은 영역을
hwp.Run(“Copy”);
hwp.Run(“Paste”);
를 이용했을때는 정상적으로 선택된 영역만 복사가 되네요
일단 메뉴얼에 나와 있는대로
BlockSave 와 InsertFilet을 이용해서 처리하니까 설정한 블럭만 정확히 저장/붙여넣기 되네요 ^^;
코드는
/// 블럭 저장
string tempfile = @"C:\Temp\hwptempfile.hwp";
hwp.HAction.GetDefault("FileSaveBlock_S", hwp.HParameterSet.HFileOpenSave.HSet);
hwp.HParameterSet.HFileOpenSave.FileName = filename;
hwp.HParameterSet.HFileOpenSave.Format = "HWP";
hwp.HParameterSet.HFileOpenSave.Attributes = 1;
hwp.HAction.Execute("FileSaveBlock_S", hwp.HParameterSet.HFileOpenSave.HSet);
/// 새 탭 열기
hwp.Run("FileNewTab");
/// 끼워넣기
hwp.HAction.GetDefault("InsertFile", hwp.HParameterSet.HInsertFile.HSet);
var option = hwp.HParameterSet.HInsertFile;
option.Filename = tempfile; // 끼워넣을 파일 이름
option.KeepCharshape = 1; // 글자모양 유지
option.KeepParashape = 0; // 문단모양 유지
option.KeepStyle = 0; // 스타일 유지
option.KeepSection = 0; // 쪽 모양 유지
hwp.HAction.Execute("InsertFile", hwp.HParameterSet.HInsertFile.HSet); // 설정 옵션으로 실제 파일 끼워넣기 실행
원래 원했던거는 디스크를 읽고 쓰지 않고 메모리에서만 읽고 쓰기 위했던거였는데…
copy/paste 는 윈도우 공용 메모리를 사용하다보니 다른 윈도우 응용프로그램과의 문제가 있어서
변경하였는데 GetTextFile/SetTextFile도 내부적으로는 디스크에 저장/불러오기 방식인듯 하여
애매하긴 하네요…
제가 처음에 생각했던 방식은 이런 개념이었는데요
// 문자열을 바이트 배열로 변환
byte[] byteArray = Encoding.UTF8.GetBytes(data);
// MemoryStream 생성 및 데이터 쓰기
using (MemoryStream stream = new MemoryStream())
{
// 데이터를 MemoryStream에 쓰기
stream.Write(byteArray, 0, byteArray.Length);
// 스트림의 위치를 처음으로 설정
stream.Seek(0, SeekOrigin.Begin);
// MemoryStream에서 데이터 읽기
byte[] readBuffer = new byte[byteArray.Length];
stream.Read(readBuffer, 0, readBuffer.Length);
// 읽은 데이터를 문자열로 변환
string readData = Encoding.UTF8.GetString(readBuffer);
Console.WriteLine("읽은 데이터: " + readData);
}
이런식으로 가능할까요?
1개의 좋아요
네. 말씀하신대로 GetTextFile/SetTextFile도 내부 구현은
디스크 IO를 사용하는 방식을 사용하고 있습니다.
현재는 디스크 IO를 사용하지 않고 메모리 버퍼로만 데이터를 주고 받는 API는 없습니다. ![:sob: :sob:](https://emoji.discourse-cdn.com/twitter/sob.png?v=12)
감사합니다.
1개의 좋아요