Trình chuyển đổi HWP dựa trên Pandoc - Giới thiệu công cụ mã nguồn mở chuyển đổi md, html, docx sang hwpx.
(github.com/msjang)Tôi đã phát triển công cụ này để giải quyết sự bất tiện khi làm việc với tài liệu HWP sau 9 năm làm việc tại viện nghiên cứu nhà nước.
Bối cảnh phát triển
- Năm 2018: thời mới làm quen với Python, đã thử tạo bộ chuyển đổi HML/HWPML dựa trên biểu thức chính quy - https://github.com/msjang/md2hml
- Tháng 1 năm 2025: phát triển hwpfy
- Tổng hợp báo cáo công việc hằng tuần của khoảng 20 người dựa trên wiki chỉnh sửa cộng tác thời gian thực
- Wiki → xuất ra DOCX → chuyển thành DOCX áp dụng biểu mẫu hành chính (hwpfy) → mở bằng ứng dụng Hancom Hangul và lưu thành HWPX → chia sẻ HWPX cho bộ phận cấp trên trong viện
- Tháng 12 năm 2025: pypandoc-hwpx
- Lúc này tôi nghĩ mình đã tích lũy đủ nội công, nên dành thời gian nghiêm túc để phát triển.
Cách phát triển
- Tôi tạo DOCX theo đúng định dạng mong muốn rồi lưu thành HWPX.
- Tôi giải nén DOCX và HWPX đã tạo để xem XML, loại bỏ các thuộc tính không cần thiết và tinh chỉnh lại. Sau đó cũng kiểm tra xem chúng có mở tốt trong Word và ứng dụng Hangul hay không.
- Tôi tạo một tài liệu so sánh các định dạng md, html, docx, hwpx. - https://github.com/msjang/pypandoc-hwpx/…
- Ban đầu tôi định dùng
format_comparison.mdở trên để nhờ LLM viết mã, nhưng rồi nhận ra rằng mình đã có sẵn HWPX đáp án. - Tôi đã xây dựng nó bằng cách nhiều lần nhận phản hồi từ Antigravity (Gemini Pro 3). Vì kết quả không ra đúng định dạng mong muốn, tôi đã soi rất kỹ XML để đưa phản hồi. Dù không nhắc trực tiếp đến tài liệu so sánh định dạng, việc nắm rõ nội dung của nó đã giúp ích rất nhiều trong quá trình rà soát.
Việc sẽ làm tiếp theo
Tôi muốn loại bỏ phần Python khỏi Pypandoc, viết bằng Haskell và đóng góp HWPX writer cho Pandoc.
7 bình luận
https://velog.io/@wjsdj2009/Lee Jun-seok-i-rang-cuoc-bau-cu-tong-thong-side-project-han-cau-chuyen-feat.-Haksikmeokja-tc85y4ok
Có bài viết như thế này, hay là thử liên hệ với các chính trị gia xem...?
Có cảm giác đây là thứ mà Hancom lẽ ra phải tự phát triển trước mới đúng... nếu Hancom thực sự có ý định mở rộng ra thị trường quốc tế.
Ủng hộ việc đóng góp cho Haskell!
Ban đầu tôi định làm từ từ trong một hai tháng, nhưng hôm qua tin này đã lên https://youtu.be/8cSqPRsM_Yg nên tôi vội vàng làm gấp.
Hay đấy
Tuy nhiên, xin phép được nói rằng hướng chuyển đổi mà tổng thống mong muốn
có phải là
hwp* -> .md, docs, pdf plain text ...không? Dự án này có hỗ trợ cả chuyển đổi ngược lại không?Đã có nhiều thư viện để phân tích
hwphayhwpxtừ trước đến nay. Về nền tảng Java thì cái này khá nổi tiếng.https://github.com/neolord0/hwplib
https://github.com/neolord0/hwpxlib
Có một thư viện bọc Hancom win32 API bằng Python. Đây là thứ thường xuất hiện trong các bài giảng tự động hóa HWP thời kỳ đầu. Tức là điều khiển ứng dụng HWP trên Windows từ backend.
https://pypi.org/project/pyhwpx/
Ngoài ra, để xử lý HWPX độc lập bằng Python mà không cần chương trình riêng thì có cái này. Có thể đọc hoặc thay thế nội dung, đồng thời cũng có thể thêm đoạn văn hay bảng biểu. https://github.com/airmang/python-hwpx
Nhưng nghĩ kỹ thì phần lớn chúng ta giao tiếp với ứng dụng LLM. Chúng ta truy cập ChatGPT, Claude, Gemini bằng trình duyệt web và trò chuyện. Kể cả khi chạy mô hình cục bộ bằng OpenWebUI thì cũng truy cập bằng trình duyệt để sử dụng. Kết quả giao tiếp bằng chế độ giọng nói của ứng dụng CharGPT trên điện thoại thông minh cũng có thể xem lại nhật ký chat trên trình duyệt web. Và nếu nhấn nút sao chép đầu ra của LLM rồi dán vào Notepad, bạn sẽ thấy đó là markdown.
LLM tạo ra markdown hoặc html, vậy có thư viện nào chuyển thẳng chúng sang hwpx để lưu không? Không có.
Khi suy nghĩ về ý tưởng bằng sáng chế với GEMINI Pro, nó sẽ hỏi có muốn tạo thành tài liệu không. Và khi bấm nút, một bản nháp bản mô tả sáng chế đã được tạo trong Google Docs. Thực chất chỉ là chuyển đổi markdown thành tài liệu, nhưng xem khá ổn.
Dù thích hay không, Hàn Quốc đã lấy HWP làm tiêu chuẩn cho xử lý công việc và giao tiếp. Và trong workflow công việc của chúng ta, việc tạo HWP theo một nghĩa nào đó là điều đương nhiên.
Sau khi để ChatGPT ở chế độ giọng nói nghe toàn bộ nội dung cuộc họp, rồi yêu cầu kiểu như “hãy tóm tắt thành biên bản cuộc họp và gửi email cho những người tham gia”, hoặc “hãy biến nội dung brainstorming thành bản nháp bản mô tả sáng chế”, thì ý ở đây là đầu ra đó phải là HWP.
Cho đến nay, con người vẫn phải sao chép kết quả từ LLM trên trình duyệt sang ứng dụng Hangul, rồi chỉnh định dạng, chăm chỉ điều chỉnh độ giãn ngang ký tự, khoảng cách chữ và dàn trang.
Trong thời đại GEMINI có thể tạo Google Docs, chẳng phải các mô hình và dịch vụ LLM được tài trợ bằng tiền thuế của Hàn Quốc cũng nên tạo được HWPX mà không cần con người can thiệp sao?
Tôi có nhu cầu như vậy để tự động hóa công việc, và vì thế tôi đã tạo ra nó.
Chuyện ngoài lề.
Bản thân HWP thì chỉ cần parse là khá dễ chuyển sang văn bản. Từ những năm 2000, Google đã tạo ra và tự áp dụng việc này để lập chỉ mục tài liệu tiếng Hàn, và với các mã nguồn mở được nhắc ở trên thì cũng hoàn toàn làm được.
Nếu áp dụng các kiểu outline level 1~6 tương ứng với
h1~h6của HTML thì cũng có thể tạo tài liệu mà vẫn giữ được hệ phân cấp của tài liệu.Tuy nhiên, HWP có quá nhiều tính năng trong trình soạn thảo, và người dùng lại tập trung vào việc áp dụng định dạng để bản in trên giấy trông đẹp hơn, nên họ đã không cố gắng áp dụng outline level khi định dạng tài liệu.
Điều cho thấy rõ nhất là khi trong viện nghiên cứu lưu một tài liệu HWP dài 300 trang thành PDF thì hoàn toàn không tạo ra thông tin bookmark nào. Vì thế dù là tài liệu điện tử, vẫn phải cuộn để tìm. Rất bất tiện. Nhưng với PDF dung lượng lớn, dù là máy tính tốt đến đâu thì khi cuộn nhanh để rà xem cũng sẽ bị giật lag rất nhiều.
Không thể làm việc này khi đánh giá cơ quan, nên họ in chồng chất các báo cáo dài hàng trăm trang theo đúng số lượng giám khảo để tiến hành đánh giá cơ quan. Và đánh giá xong thì vứt đi ngay.
Với báo cáo ở nước ngoài, nếu nhận một báo cáo PDF dài 400 trang thì riêng mục lục đã dài 16 trang và trong mục lục có gắn liên kết nên chỉ cần bấm là chuyển đến trang tương ứng. Nếu xem outline thì bookmark được chia rất chi tiết và tổ chức rất tốt. Điều này có nghĩa là trong công cụ, ngay cả khi người dùng không chủ động để ý, các thông tin đó vẫn được nhập một cách dễ dàng và tự động tạo ra.
Dù sao thì quay lại vấn đề, với HWP được tạo ra theo thói quen hiện nay là đa số dùng Hancom Hangeul, vẫn có thể lấy được văn bản, nhưng rất khó lấy được thông tin phân cấp của tài liệu.
Tuy nhiên, nếu tạo HWP bằng LLM mà không cần con người can thiệp thì có thể tự động tạo ra tài liệu có tính đến những điểm này.