Convertidor de Hancom HWP basado en Pandoc: presentamos una herramienta open source que convierte md, html y docx a hwpx.
(github.com/msjang)Lo desarrollé para resolver las incomodidades del trabajo con documentos HWP, tras 9 años trabajando en un instituto de investigación gubernamental.
Antecedentes del desarrollo
- 2018: en mis inicios con Python, intenté un convertidor HML/HWPML basado en expresiones regulares - https://github.com/msjang/md2hml
- Enero de 2025: desarrollo de hwpfy
- Consolidación de reportes semanales de trabajo de unas 20 personas basada en una wiki con edición colaborativa en tiempo real
- Wiki → exportar a DOCX → convertir a DOCX con formato para organismos públicos (hwpfy) → abrir en la app de Hancom y guardar como HWPX → compartir como HWPX con el departamento superior dentro de la institución
- Diciembre de 2025: pypandoc-hwpx
- Como sentí que ya había acumulado suficiente experiencia, esta vez lo desarrollé dedicándole tiempo en serio.
Método de desarrollo
- Creé un DOCX con el formato deseado y lo guardé como HWPX.
- Descomprimí el DOCX y el HWPX generados para revisar los XML, eliminé propiedades innecesarias y los ajusté. También verifiqué que se abrieran correctamente tanto en Word como en la app de Hancom.
- Creé un documento para comparar los formatos md, html, docx y hwpx. - https://github.com/msjang/pypandoc-hwpx/…
- Originalmente iba a usar el
format_comparison.mdde arriba para pedirle a un LLM que escribiera el código, pero me di cuenta de que ya tenía un HWPX de referencia con la respuesta correcta. - Lo fui construyendo tras varias rondas de retroalimentación con Antigravity (Gemini Pro 3). Como no salía en el formato que quería, revisé el XML en detalle y fui dando feedback. Aunque no mencioné de forma directa el documento de comparación de formatos, haber asimilado su contenido me ayudó mucho al revisar.
Próximos pasos
Quiero quitar Python de Pypandoc, programarlo en Haskell y contribuir un writer de HWPX a Pandoc.
7 comentarios
https://velog.io/@wjsdj2009/… project-para-la-presidencial-feat.-Comamos-en-la-cafetería-tc85y4ok
Hay un artículo así; ¿qué tal si intentan contactar a algunos políticos...?
Parece el tipo de herramienta que Hancom debería haber desarrollado primero... si de verdad tuviera intención de expandirse al extranjero.
¡Apoyo las contribuciones a Haskell!
Originalmente pensaba hacerlo con calma durante uno o dos meses, pero ayer salió la noticia de https://youtu.be/8cSqPRsM_Yg, así que lo hice a toda prisa.
Está genial.
Pero, con todo respeto, ¿la dirección de conversión que quiere el presidente no sería más bien
hwp* -> .md, docs, pdf plain text ...? ¿El proyecto también admite la conversión inversa?Ha habido muchas bibliotecas para parsear
hwpohwpxdesde hace tiempo. En Java, esta es conocida.https://github.com/neolord0/hwplib
https://github.com/neolord0/hwpxlib
En Python existe una que envuelve la API win32 de Hancom. Es la que aparecía en los cursos iniciales de automatización de HWP. Básicamente controla la app de HWP para Windows desde el backend.
https://pypi.org/project/pyhwpx/
En Python también está esta opción para manejar HWPX de forma standalone, sin programa aparte. Permite leer o reemplazar contenido, y también agregar párrafos o tablas. https://github.com/airmang/python-hwpx
Pero si lo pensamos bien, la mayoría nos comunicamos con apps de LLM. Entramos a ChatGPT, Claude o Gemini desde el navegador y conversamos por chat. Incluso si ejecutamos modelos locales con OpenWebUI, los usamos accediendo desde el navegador. Los resultados de interactuar con el modo de voz de la app de CharGPT en el smartphone también se pueden revisar como registro de chat en el navegador. Y si tomas la salida del LLM, presionas copiar y la pegas en un bloc de notas, puedes comprobar que está en markdown.
Sale markdown o html desde el LLM, pero ¿existe una biblioteca que lo convierta directamente a
hwpxy lo guarde? No existe.Cuando uno anda pensando ideas de patentes con GEMINI Pro, te pregunta si quieres que lo convierta en un documento. Y cuando presionas el botón, ya está creado en Google Docs un borrador de la memoria descriptiva de la patente. Al final solo convierte markdown y lo vuelve documento, pero el resultado se ve bastante bien.
Nos guste o no, Corea del Sur adoptó HWP como estándar para impulsar el trabajo y la comunicación. Y dentro de nuestro flujo de trabajo, generar HWP es, en cierto modo, algo natural.
Después de dejar que el modo de voz de ChatGPT escuche todo el contenido de una reunión, cuando le pides cosas como “resúmelo y conviértelo en un acta de reunión, luego envíalo por correo a los participantes” o “convierte lo discutido en la lluvia de ideas en un borrador de memoria descriptiva de patente”, la idea es que ese resultado debería ser un HWP.
Hasta ahora, el proceso ha sido que una persona copie el resultado del LLM desde el navegador hacia la app de Hancom, luego ajuste el formato, el ancho de caracteres, el espaciado y haga toda la maquetación manualmente.
En una época en la que GEMINI ya te crea Google Docs, ¿no deberían los modelos y servicios de LLM financiados con impuestos de Corea del Sur generar también HWPX sin intervención humana?
Yo tenía esta necesidad para automatizar trabajo, y por eso lo hice.
Posdata.
El HWP en sí es fácil de parsear y convertir a texto. Google ya había creado y aplicado internamente esa capacidad desde los años 2000 para indexar documentos en coreano, y con los proyectos de código abierto mencionados arriba es totalmente posible.
Si se aplican a HTML los estilos de nivel de esquema 1 a 6 que corresponden a
h1~h6, también se puede crear un documento preservando la jerarquía del documento.Sin embargo, HWP tiene demasiadas funciones en el editor, y quienes lo usan se han concentrado en aplicar formato para que las impresiones en papel se vean bien, en lugar de esforzarse por aplicar niveles de esquema (
outline level) al dar formato.Esto se ve claramente en que, cuando en un instituto se guarda como PDF un documento HWP de 300 páginas, no se genera ni una sola entrada de marcador. Por eso, aunque sea un documento electrónico, hay que ir buscándolo desplazándose con scroll. Es sumamente incómodo. Y en PDF pesados, por muy buena que sea la computadora, si haces scroll rápido para revisarlo por encima, se traba muchísimo.
Como no se puede hacer eso durante una evaluación institucional, imprimen montones de informes de cientos de páginas según la cantidad de evaluadores y así realizan la evaluación. Y cuando termina, los tiran de inmediato.
En los informes del extranjero, cuando recibes un PDF de 400 páginas, solo la tabla de contenido ya ocupa 16 páginas y tiene enlaces, así que al hacer clic te lleva a la página correspondiente. Si abres la vista de esquema, los marcadores están muy bien subdivididos. Eso significa que la herramienta los generó automáticamente con datos que una persona puede ingresar fácilmente sin tener que pensarlo de forma consciente.
En fin, volviendo al tema: de los HWP creados por la costumbre actual de que la gran mayoría use Hancom Hangul, se puede obtener texto, pero es difícil extraer la información de jerarquía del documento.
Pero si un LLM genera HWP sin intervención humana, puede crearlo automáticamente teniendo en cuenta estos aspectos.