Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

안녕하세요. 몇가지 질문사항이 있어 문의 드립니다. #47

Closed
kamsi76 opened this issue Apr 10, 2019 · 16 comments
Closed

Comments

@kamsi76
Copy link

kamsi76 commented Apr 10, 2019

우선 감사합니다.
이번 프로젝트에서 한글 파일로 파일 추출하는게 있어서.. 찾다가 여기까지 왔습니다.
이렇게 만들어 주셔서 정말 감사합니다.

작업하던 중 확인하고자 하는 부분이 있어서 질문을 드립니다.

혹시 특정 Table을 복사 해뒀다가 복사 하는 기능 같은 것도 있나 해서 질문 드려 봅니다.

또, Table에서 Row를 삭제 하는 기능이 있는지도 알고 싶습니다.

table.getRowList().remove(2);
이런식으로 했더니.. 한글 문서가 중간에 뻣어 버리네요.

감사합니다.

@kamsi76 kamsi76 changed the title 복사 기능이 가능한지 여부를 알고 싶습니다. 안녕하세요. 몇가지 질문사항이 있어 문의 드립니다. Apr 10, 2019
@neolord0
Copy link
Owner

  1. 혹시 특정 Table을 복사 해뒀다가 복사 하는 기능 같은 것도 있나 해서 질문 드려 봅니다.
    ; 간단하게 특정 Table을 복사 해뒀다가 붙여넣는 기능은 없습니다. 약간의 작업이 필요할 거 같습니다.
    동일한 파일에서 테이블을 복사하여 붙여넣는 기능은 비교적 간단하게 가능할 거 같습니다만, 다른 파일에 붙여 넣으려면, 글로벌 객체(문단 속성, 글자 속성 객체)을 옴겨야 하기 때문에 약간 어려울 수 있을 거 같습니다.

  2. 또, Table에서 Row를 삭제 하는 기능이 있는지도 알고 싶습니다.
    ; 테이블에 Row를 삭제하기 위해서도.. 단순히 table.getRowList().remove(2) 하는 것만으로는 삭제가 되지 않습니다. 이 함수는 단순히 리스트안에 있는 row 객체를 삭제하는 역할만을 합니다. 테이블에 대한 정보를 변경해 주셔야 합니다.
    table.getTable()에 보시면 행의 개수나 각 행의 셀의 개수를 저장하는 리스트를 저장한 속성이 있는데 이 부분을 행을 삭제한 후에 상태에 맞게 수정해 주셔야 합니다. 이렇게 하면 한글에서 문제없이 읽어 드릴 겁니다.

@kamsi76
Copy link
Author

kamsi76 commented Apr 11, 2019

답변 감사합니다~^ ^
복사 기능은 다른 파일이 아닌 하나의 파일에서 동일하게 반복되는 항목이 있어서 문의 드렸던 겁니다^ ^

@kamsi76
Copy link
Author

kamsi76 commented Apr 11, 2019

특정 테이블을 검색하고

        ControlTable table = findTable(hwpFile, "점검참여인력테이블");

	Row row = table.addNewRow();

	int rowIndx = table.getRowList().size()-1;

	Cell cell = row.addNewCell();
	CellHelper helper = new CellHelper(cell, 0, rowIndx);
	helper.setDefault();
	ListHeaderForCell listHeader = helper.getListHeader();
	listHeader.setHeight(CommonUtils.mmToHwp(10.0));
	helper.setParagraph("1");

	cell = row.addNewCell();
	helper = new CellHelper(cell, 1, rowIndx);
	helper.setDefault();
	helper.getListHeader().setBorderFillId(BorderHelper.getStyle("noneRight"));
	helper.setParagraph("2");

	cell = row.addNewCell();
	helper = new CellHelper(cell, 2, rowIndx);
	helper.setDefault();
	helper.getListHeader().setBorderFillId(BorderHelper.getStyle("noneLeft"));

	helper.setParagraph("2");

	**table.getRowList().remove(1);
	Table tableRecord = table.getTable();
	tableRecord.setRowCount(table.getRowList().size());**

테이블 2번째 Row를 삭제 하고 사이즈를 재조정했는데도...
문서가 열리지 않습니다.
Row수 말고 더 수정해 줘야 하는게 있을까요?

@neolord0
Copy link
Owner

테이블의 복사/붙여넣기 기능을 하려면,

  1. ControlTable을 clone하는 코드를 만들어야 합니다. 이 코드는 하위에 모든 객체를 clone해야 합니다. 이 부분은 코드 양은 많지만.. 어려운 부분은 아닙니다. 새로운 ControlTable 객체를 만들고 속성 하위 객체 들을 복사해 넣으면 됩니다.

  2. 그 후에, 복사된 객체를 문단에 붙어넣어야 하는데.. 문단에 구조를 알아야 합니다.
    문단은 라이브러리에서 Paragraph로 정의되어 있는데요.
    여기에는
    private ParaHeader header; // 헤더
    private ParaText text; // 텍스트
    private ParaCharShape charShape; // 글자모양
    private ParaLineSeg lineSeg; // 레이아웃
    private ParaRangeTag rangeTag; // 영역테그
    private ArrayList controlList; // 컨트롤 리스트
    private ArrayList memoList; // 메모 리스트
    등의 하위 객체가 있습니다.

테이블 컨트롤을 추가하려면, 첫번째로 , controlList에 테이블 컨트롤을 추가해주어야 합니다.
그리고, paraText에 테이블 컨트롤에 해당하는 확장 컨트롤 문자를 추가해 주어야 합니다.
이 부분에 대해서 예를 들어 설명하면, 어떤 문단에서

가나[테이블]다라[사각형]마바

이런 내용이 있다면
paraText는

[일반 문자객체:가], [일반 문자객체:나], [확장컨트롤 문자객체:컨트롤], [일반 문자객체:다], [일반 문자객체:라], [확장컨트롤 문자객체:사각형], [일반 문자객체:마], [일반 문자객체:바]

, controlList에는

[테이블 컨트롤], [사각형 컨트롤]

이 들어 갑니다. 이런 식으로 컨트롤에 대한 [확장컨트롤 문자] 객체를 추가해 줘야 합니다.
문단의 끝에 추가하는 건 어렵지 않은데, 문단 중간에 넣을 경우에는, controlList에 컨트롤의 순서에 유의해 줘야 합니다.

그리고, 다음에 주의할 사항이 있는데, 글자 모양과 관련된 부분입니다
만약,
문단이

가나다라마바

이런 식으로 글자모양이 바뀌는 경우에는

charShape에 바뀐 위치와 글자모양 객체의 인덱스가 저장됩니다. 예제 같은 경우에는

(위치:0, 보통 글자모양 인텍스), (위치:3, 굵은 글자모양 인덱스)

이런 식으로 저장됩니다 .

컨트롤이 문단 중간에 추가되면 컨트롤에 해당하는 확장컨트롤 문자가 중간에 삽입되기 때문에, 그 이후에 위치가 변경될 수 있습니다. 이 점을 주의해서.. 수정해야 합니다.

@neolord0
Copy link
Owner

테이블 row 삭제에 대해서는 간단한 샘플을 작성해 드리겠습니다.

@neolord0
Copy link
Owner

테이블 row 삭제하는 코드를 샘플로 추가했습니다.
보시면.. 이해하시리라 생각됩니다.

@kamsi76
Copy link
Author

kamsi76 commented Apr 16, 2019

감사합니다~^ ^
이해는 가는데 어렵네요..ㅜㅜ

지금은 Section에 문단(Paragrph)를 하나 추가 하고 싶은데 그 마저도 쉽지 않네요.

            Section firstSection = hwpFile.getBodyText().getSectionList().get(0);

	Paragraph firstParagraph = firstSection.addNewParagraph();
	ParaText paraText = firstParagraph.getText();
	if( paraText == null ) {
		firstParagraph.createText();
		paraText = firstParagraph.getText();
	}

	//테이블을 생성하기 위한 위치
	paraText.addExtendCharForTable();

	ControlTable table = (ControlTable) firstParagraph.addNewControl(ControlType.Table);
	TableHelper.getDefault(table);

	Table tableRecord = table.getTable();
	tableRecord.getProperty().setDivideAtPageBoundary(DivideAtPageBoundary.DivideByCell);
	tableRecord.getProperty().setAutoRepeatTitleRow(false);
	tableRecord.setRowCount(4);
	tableRecord.setColumnCount(3);
	tableRecord.setCellSpacing(0);
	tableRecord.setLeftInnerMargin(0);
	tableRecord.setRightInnerMargin(0);
	tableRecord.setTopInnerMargin(0);
	tableRecord.setBottomInnerMargin(0);
	tableRecord.setBorderFillId(BorderHelper.getStyle(BorderStyle.ALL_SOLID));

	tableRecord.getCellCountOfRowList().add(3);
	tableRecord.getCellCountOfRowList().add(3);
	tableRecord.getCellCountOfRowList().add(3);
	tableRecord.getCellCountOfRowList().add(3);

	for(int r = 0; r < 4; r++ ) {
		Row row = table.addNewRow();

		for( int c = 0; c < 3; c++ ) {
			Cell cell = row.addNewCell();
			CellHelper cellHelper = new CellHelper(cell, c, r);
			ListHeaderForCell listHeader = cellHelper.getListHeader();
			listHeader.setWidth(CommonUtils.fromMM(20.0));
			listHeader.setHeight(CommonUtils.fromMM(10.0));
			cellHelper.setParagraph(r + " : " +  c);
		}
	}

위에 말씀하신 거 처럼 문단을 하나 추가 했고
문단에 createText 를 통하여 영역도 하나 생성 했습니다.

그런데 문서 오픈 시 오류가 발생하네요..ㅜㅜ

@kamsi76
Copy link
Author

kamsi76 commented Apr 16, 2019

아~
firstParagraph.createCharShape();
firstParagraph.getCharShape().addParaCharShape(0, 100);

이넘을 생성해 줘야 하는군요~
흠... 어렵네용..ㅜㅠㅋ

@kamsi76
Copy link
Author

kamsi76 commented Apr 16, 2019

자꾸 질문 드려 죄송합니다.

Cell에 색상 넣으려면 어떻게 해야 하나요??

ListHeaderForCell 에도 없고... Property에도 없어서...
그렇다고 Cell에도 속성이 없더라구요...

제가 못 찾는것인지...

답변 부탁드릴께요...ㅜㅜ

@neolord0
Copy link
Owner

firstParagraph.createCharShape();
firstParagraph.getCharShape().addParaCharShape(0, 100);

여기서.. addParaCharShape(long position, long charShapeId) 함수에 첫번째 매개변수는 위치고요.. 두번째 파라미터는 글자모양 객체의 인덱스 입니다.

글자모양 객체는 HWPFIle.docInfo.charShapeLIst에 있는 객체의 인텍슨데요...
100 번이 맞는지요 ?
없는 객체를 넣어주면 지금은 잘 읽어도 나중에 업데이트에서 보안이 강화되면 에러가 발생할 수 있습니다. 주의하세요..

그리고, Cell의 배경색 정보는 글자모양(CharShape)와 비슷하게 글로벌 객체인 BorderFill 이라는 객체에 의해
설정되고 BorderFill 객체는 ListHeaderForCell.setBorderFillId(); 함수로 연결됩니다

test/TestMakingTable.java 예제를 보시면 어떻게 설정할 수 있는지 알 수 있으실 겁니다.

@kamsi76
Copy link
Author

kamsi76 commented Apr 25, 2019

넵 항상 답변 주셔서 감사합니다.
한가지만 더 여쭤보겠습니다.

혹시 특정 부분에서만 쪽나누기를 하려면 어떻게 해야 하나요?

지금 공통적으로
DocInfo docInfo = hwpFile.getDocInfo();
docInfo.getParaShapeList().get(0).getProperty1().setSplitPageBeforePara(true);

이걸써서 전체적으로 문단에 다 적용되는데 특정 문단에서 적용되게 하려면 어떻게 해야 하는지 알고 싶습니다.

@kamsi76
Copy link
Author

kamsi76 commented Apr 25, 2019

자답입니다...^ ^
찾았습니다.

paragraph.getHeader().getDivideSort().setDividePage(true);
이걸 사용하면 Page 나누기가 되네요~

@neolord0
Copy link
Owner

페이지 나누는 여러가지 방법이 있는데.. 그 방법이 제일 편리한 방법입니다..

@kamsi76
Copy link
Author

kamsi76 commented Apr 26, 2019

다시 여쭤볼게요..ㅜㅜ

문자열과 문자열 사이에 탭을 넣고 싶습니다.

paraText.addString("동해물과 백두산이");

paraText.addNewInlineControlChar().setCode((short)9);

paraText.addString("마르고 닳도록...");

위와 같이 "동해물과 백두산이 [TAB] 마르고 닳도록..." 이렇게 하고 싶은데..ㅜㅜ

ForParaText.java의 131번 라인 sw.writeBytes(hc.getAddition());
여기서 계속 NullpointerException이 발생하네요..ㅜㅜ

저 addition은 어떻게 설정해 주는것인지 알수 있을까요?

늘 감사합니다..

@neolord0
Copy link
Owner

이건 paraText.addNewInlineControlChar()으로 추가된..
HWPCharControlInline에 addtion 이라는 멤버를 세팅하지 않아서 생기는 오류인거 같습니다.
HWPCharControlInline.setAddtion()함수로 추가정보를 설정해야 합니다.

문서에 [Tab]을 넣고 읽어보니..

image

이렇게 되더군요..
addtion 부분에.. size=12 짜리 byte[]을 위와 같이 세팅하여 넣어주시면 될 거 같습니다.

@kamsi76
Copy link
Author

kamsi76 commented Apr 29, 2019

감사합니다~^ ^
덕분에 많은 도움이 되네요.
정말 감사합니다~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants