Skip to content

Latest commit

ย 

History

History
109 lines (76 loc) ยท 4.48 KB

File metadata and controls

109 lines (76 loc) ยท 4.48 KB

5๋ถ„ ์•ˆ์— HWPX ๋ฌธ์„œ ๋‹ค๋ฃจ๊ธฐ

์ด ๊ฐ€์ด๋“œ๋Š” python-hwpx๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๋ถ„์„ ์œ„ํ•œ ์ดˆ๊ฐ„๋‹จ ํŠœํ† ๋ฆฌ์–ผ์ž…๋‹ˆ๋‹ค. ์„ค์น˜๋ถ€ํ„ฐ ๋ฌธ์„œ๋ฅผ ์—ด๊ณ  ์ˆ˜์ •ํ•œ ๋’ค ์ €์žฅํ•˜๋Š” ๊ณผ์ •๊นŒ์ง€ ํ•ต์‹ฌ ํ๋ฆ„๋งŒ ๋น ๋ฅด๊ฒŒ ์ตํž™๋‹ˆ๋‹ค.

์ค€๋น„๋ฌผ

pip install python-hwpx

ํŒจํ‚ค์ง€์—๋Š” ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์ด ํ•จ๊ป˜ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์Šต์šฉ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด hwpx.templates.blank_document_bytes()๋ฅผ ์‚ฌ์šฉํ•ด ๋นˆ ๋ฌธ์„œ๋ฅผ ์ฆ‰์‹œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด์œ  ์ค‘์ธ HWPX ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด ๊ฒฝ๋กœ๋งŒ ๊ต์ฒดํ•ด ์‹คํ–‰ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

Jupyter Notebook์ด๋‚˜ IPython์—์„œ ์‹คํ—˜ํ•˜๋ฉด XML ๊ตฌ์กฐ๋ฅผ ๊พธ์ค€ํžˆ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ธฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ๋ฌธ์„œ ์—ด๊ธฐ์™€ ๊ธฐ๋ณธ ์ •๋ณด ํ™•์ธ

from io import BytesIO

from hwpx import HwpxDocument
from hwpx.templates import blank_document_bytes

source = BytesIO(blank_document_bytes())
document = HwpxDocument.open(source)
print("์ด ์„น์…˜ ์ˆ˜:", len(document.sections))
print("์ฒซ ๋ฒˆ์งธ ๋ฌธ๋‹จ ํ…์ŠคํŠธ:", document.paragraphs[0].text)

HwpxDocument.open()์€ ํŒŒ์ผ ๊ฒฝ๋กœ, ๋ฐ”์ดํŠธ, ํŒŒ์ผ ๊ฐ์ฒด ๋“ฑ ๋‹ค์–‘ํ•œ ์ž…๋ ฅ์„ ๋ฐ›์•„ ๋ฌธ์„œ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ document ๊ฐ์ฒด๋Š” ์„น์…˜, ๋ฌธ๋‹จ, ํ‘œ ๋“ฑ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์ˆ˜์ค€ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €(with)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ธ”๋ก ์ข…๋ฃŒ ์‹œ์ (์ •์ƒ/์˜ˆ์™ธ ๋ชจ๋‘)์—๋„ ๋‚ด๋ถ€ ์ž์› ์ •๋ฆฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

from hwpx import HwpxDocument

with HwpxDocument.open("input/sample.hwpx") as document:
    document.add_paragraph("with ๋ธ”๋ก ์•ˆ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ํŽธ์ง‘")
    document.save("output/sample-updated.hwpx")

2. ์ƒˆ ๋ฌธ๋‹จ ์ถ”๊ฐ€ํ•˜๊ธฐ

section = document.sections[0]
paragraph = document.add_paragraph(
    "python-hwpx๋กœ ์ƒ์„ฑํ•œ ๋ฌธ๋‹จ์ž…๋‹ˆ๋‹ค.",
    section=section,
)

print("์ถ”๊ฐ€๋œ ๋ฌธ๋‹จ:", paragraph.text)

๋ฌธ๋‹จ์€ ํ•ญ์ƒ ํŠน์ • ์„น์…˜์— ์†ํ•ฉ๋‹ˆ๋‹ค. ์„น์…˜์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋งˆ์ง€๋ง‰ ์„น์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ๋ฐ›์€ paragraph๋Š” ๋Ÿฐ(run) ์ถ”๊ฐ€, ๋ฉ”๋ชจ ์•ต์ปค ์—ฐ๊ฒฐ ๋“ฑ ํ›„์† ์กฐ์ž‘์„ ํ•  ๋•Œ ๊ณ„์† ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ํ‘œ ๋งŒ๋“ค๊ธฐ์™€ ๊ฐ’ ์ฑ„์šฐ๊ธฐ

table = document.add_table(rows=2, cols=2, section=section)

table.set_cell_text(0, 0, "ํ•ญ๋ชฉ")
table.set_cell_text(0, 1, "๊ฐ’")
table.set_cell_text(1, 0, "๋ฌธ๋‹จ ์ˆ˜")
table.set_cell_text(1, 1, str(len(document.paragraphs)))

์ƒ์„ฑ๋œ ํ‘œ๋Š” ์ฒซ ๋ฒˆ์งธ ํ–‰์„ ํ—ค๋”์ฒ˜๋Ÿผ ํ™œ์šฉํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ํ–‰์— ํ˜„์žฌ ๋ฌธ๋‹จ ์ˆ˜๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์…€ ํ…์ŠคํŠธ๋Š” UTF-8 ๋ฌธ์ž์—ด๋กœ ๋ฐ”๋กœ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œ์— ํ…Œ๋‘๋ฆฌ ์ฑ„์šฐ๊ธฐ ์ •์˜๊ฐ€ ์—†๋‹ค๋ฉด add_table()์ด ์ž๋™์œผ๋กœ ๊ธฐ๋ณธ ์‹ค์„  borderFill์„ ํ—ค๋”์— ์ถ”๊ฐ€ํ•˜๊ณ  ํ‘œ/์…€์— ์ฐธ์กฐ๋ฅผ ์ฑ„์›Œ ๋„ฃ์Šต๋‹ˆ๋‹ค.

๋ณ‘ํ•ฉ๋œ ํ‘œ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” `table.iter_grid()`/`table.get_cell_map()`์œผ๋กœ ๋…ผ๋ฆฌ ์ขŒํ‘œ์™€ ์‹ค์ œ ์…€์„ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, `table.set_cell_text(..., logical=True, split_merged=True)`๋กœ ๋…ผ๋ฆฌ ์ขŒํ‘œ ๊ธฐ๋ฐ˜ ํŽธ์ง‘๊ณผ ๋ณ‘ํ•ฉ ํ•ด์ œ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ๋ฉ”๋ชจ์™€ ํ•„๋“œ ์ปจํŠธ๋กค ์ถ”๊ฐ€ํ•˜๊ธฐ

memo, paragraph, field_id = document.add_memo_with_anchor(
    "๊ฒ€ํ†  ์ค‘์ž…๋‹ˆ๋‹ค.",
    paragraph=paragraph,
    memo_shape_id_ref="0",
)

print("์ƒˆ ๋ฉ”๋ชจ ID:", memo.id)
print("ํ•„๋“œ ์ปจํŠธ๋กค ID:", field_id)

memo_shape_id_ref๋Š” ๋ฌธ์„œ ํ—ค๋”์— ์ •์˜๋œ ๋ฉ”๋ชจ ๋ชจ์–‘(ํ’์„  ๋ชจ์–‘)์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์—๋Š” ์ ์–ด๋„ ํ•˜๋‚˜์˜ ๋ชจ์–‘์ด ์ •์˜๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ "0"์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ์— MEMO ์ปจํŠธ๋กค์ด ์—†์œผ๋ฉด ํ•œ/๊ธ€์—์„œ ๋ฉ”๋ชจ ํ’์„ ์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. `add_memo_with_anchor()`๋Š” ํ•„์ˆ˜ ์ปจํŠธ๋กค์„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋ฏ€๋กœ ์ดˆ๋ณด์ž๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•˜๊ธฐ

output_path = "output/quickstart.hwpx"
document.save(output_path)
print("์ €์žฅ ์™„๋ฃŒ:", output_path)

HwpxDocument.save()์— ๊ฒฝ๋กœ๋ฅผ ๋„˜๊ธฐ๋ฉด zip ๊ธฐ๋ฐ˜์˜ HWPX ์•„์นด์ด๋ธŒ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์—†๋‹ค๋ฉด Path(output_path).parent.mkdir(parents=True, exist_ok=True)๋กœ ๋จผ์ € ์ค€๋น„ํ•ด ์ฃผ์„ธ์š”.

๋‹ค์Œ ๋‹จ๊ณ„

  • {doc}usage์—์„œ ๋” ๋งŽ์€ ํŽธ์ง‘ ํŒจํ„ด๊ณผ ํƒ€ ๊ฐ์ฒด ์กฐ์ž‘ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ธฐ
  • {doc}examples์— ์ •๋ฆฌ๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ์ „์ฒด ์›Œํฌํ”Œ๋กœ๋ฅผ ์ตํžˆ๊ธฐ
  • XML ๊ตฌ์กฐ์™€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด {doc}schema-overview ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๊ธฐ