26 puntos por shuggie 2025-12-19 | 7 comentarios | Compartir por WhatsApp

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

  1. Creé un DOCX con el formato deseado y lo guardé como HWPX.
  2. 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.
  3. Creé un documento para comparar los formatos md, html, docx y hwpx. - https://github.com/msjang/pypandoc-hwpx/…
  4. Originalmente iba a usar el format_comparison.md de 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.
  5. 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

 
roxie 2025-12-25

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...?

 
aer0700 2025-12-20

Parece el tipo de herramienta que Hancom debería haber desarrollado primero... si de verdad tuviera intención de expandirse al extranjero.

 
vpark45 2025-12-19

¡Apoyo las contribuciones a Haskell!

 
shuggie 2025-12-19

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.

 
mse9000 2025-12-19

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?

 
shuggie 2025-12-19

Ha habido muchas bibliotecas para parsear hwp o hwpx desde 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 hwpx y 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.

 
shuggie 2025-12-19

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.