Convierta rápidamente archivos (.rtf|.doc) a la sintaxis Markdown con PHP

10 minutos de lectura

avatar de usuario
Sansón

He estado convirtiendo manualmente artículos a la sintaxis de Markdown durante algunos días y se está volviendo bastante tedioso. Algunos de estos son de 3 o 4 páginas, cursivas y otros texto enfatizado en todas partes. ¿Existe una forma más rápida de convertir archivos (.rtf|.doc) para limpiar la sintaxis de Markdown que pueda aprovechar?

avatar de usuario
David

Si estás en una Mac, textutil hace un buen trabajo al convertir doc, docx y rtf a html, y pandoc hace un buen trabajo al convertir el html resultante a markdown:

$ textutil -convert html file.doc -stdout | pandoc -f html -t markdown -o file.md

tengo un guion que armé hace un tiempo que intenta usar textutil, pdf2html y pandoc para convertir todo lo que le lance a rebajas.

  • Acabo de probar esto para convertir de Word a Markdown, y funcionó maravillosamente. Gracias.

    –Jeffrey Scofield

    8 de diciembre de 2011 a las 9:18

  • brillante gracias! Descubrí que tenía que usar: textutil -convert html file.doc -stdout | pandoc -f html -t markdown -o file.md

    – danodonovan

    15 de febrero de 2012 a las 18:48

  • textutil es solo para Mac OS X. Algunas alternativas de Linux se enumeran en unix.stackexchange.com: GNU unrtf, Pandoc y unoconv.

    – Michael Witrant

    16 de agosto de 2012 a las 22:06


avatar de usuario
taj moore

ProgTips tiene una posible solución con un palabra macro (descarga de fuente):

A macro sencilla (descarga de fuente) para convertir las cosas más triviales automáticamente. Esta macro hace:

  • Reemplazar negrita y cursiva
  • Reemplazar títulos (título marcado 1-6)
  • Reemplazar listas numeradas y con viñetas

Tiene muchos errores, creo que depende de documentos más grandes, sin embargo, ¡NO estoy diciendo que sea una versión estable de todos modos! 🙂 Solo uso experimental, recodifíquelo y reutilícelo como desee, publique un comentario si ha encontrado una solución mejor.

Fuente: ProgTips

Fuente de macros

Instalación

  • abrir winword,
  • presione Alt+F11 para abrir el editor de VBA,
  • haga clic derecho en el primer proyecto en el navegador de proyectos
  • elija insertar->módulo
  • pega el código del archivo
  • cerrar el editor de macros
  • vaya herramientas>macro>macros; ejecuta la macro llamada MarkDown

Fuente: ProgTips

Fuente

Fuente macro para mantenerla segura si ProgTips elimina la publicación o el sitio se borra:

'*** A simple MsWord->Markdown replacement macro by Kriss Rauhvargers, 2006.02.02.
'*** This tool does NOT implement all the markup specified in MarkDown definition by John Gruber, only
'*** the most simple things. These are:
'*** 1) Replaces all non-list paragraphs to ^p paragraph so MarkDown knows it is a stand-alone paragraph
'*** 2) Converts tables to text. In fact, tables get lost.
'*** 3) Adds a single indent to all indented paragraphs
'*** 4) Replaces all the text in italics to _text_
'*** 5) Replaces all the text in bold to **text**
'*** 6) Replaces Heading1-6 to #..#Heading (Heading numbering gets lost)
'*** 7) Replaces bulleted lists with ^p *  listitem ^p*  listitem2...
'*** 8) Replaces numbered lists with ^p 1. listitem ^p2.  listitem2...
'*** Feel free to use and redistribute this code
Sub MarkDown()
    Dim bReplace As Boolean
    Dim i As Integer
    Dim oPara As Paragraph
    
        
    'remove formatting from paragraph sign so that we dont get **blablabla^p** but rather **blablabla**^p
    Call RemoveBoldEnters
    
    
    For i = Selection.Document.Tables.Count To 1 Step -1
            Call Selection.Document.Tables(i).ConvertToText
    Next
    
    'simple text indent + extra paragraphs for non-numbered paragraphs
    For i = Selection.Document.Paragraphs.Count To 1 Step -1
        Set oPara = Selection.Document.Paragraphs(i)
        If oPara.Range.ListFormat.ListType = wdListNoNumbering Then
            If oPara.LeftIndent > 0 Then
                oPara.Range.InsertBefore (">")
            End If
            oPara.Range.InsertBefore (vbCrLf)
        End If
        
        
    Next
    
    'italic -> _italic_
    Selection.HomeKey Unit:=wdStory
    bReplace = ReplaceOneItalic  'first replacement
    While bReplace 'other replacements
        bReplace = ReplaceOneItalic
    Wend

    'bold-> **bold**
    Selection.HomeKey Unit:=wdStory
    bReplace = ReplaceOneBold 'first replacement
    While bReplace
        bReplace = ReplaceOneBold 'other replacements
    Wend
    
   
    
    'Heading -> ##heading
    For i = 1 To 6 'heading1 to heading6
        Selection.HomeKey Unit:=wdStory
        bReplace = ReplaceH(i) 'first replacement
        While bReplace
            bReplace = ReplaceH(i) 'other replacements
        Wend
    Next
    
    Call ReplaceLists
    
    
    Selection.HomeKey Unit:=wdStory
End Sub


'***************************************************************
' Function to replace bold with _bold_, only the first occurance
' Returns true if any occurance found, false otherwise
' Originally recorded by WinWord macro recorder, probably contains
' quite a lot of useless code
'***************************************************************
Function ReplaceOneBold() As Boolean
    Dim bReturn As Boolean

    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Font.Bold = True
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    
    bReturn = False
    While Selection.Find.Execute = True
        bReturn = True
        Selection.Text = "**" & Selection.Text & "**"
        Selection.Font.Bold = False
        Selection.Find.Execute
    Wend
    
    ReplaceOneBold = bReturn
End Function

'*******************************************************************
' Function to replace italic with _italic_, only the first occurance
' Returns true if any occurance found, false otherwise
' Originally recorded by WinWord macro recorder, probably contains
' quite a lot of useless code
'********************************************************************
Function ReplaceOneItalic() As Boolean
    Dim bReturn As Boolean

        Selection.Find.ClearFormatting
    
    With Selection.Find
        .Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Font.Italic = True
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    
    bReturn = False
    While Selection.Find.Execute = True
        bReturn = True
        Selection.Text = "_" & Selection.Text & "_"
        Selection.Font.Italic = False
        Selection.Find.Execute
    Wend
    ReplaceOneItalic = bReturn
End Function

'*********************************************************************
' Function to replace headingX with #heading, only the first occurance
' Returns true if any occurance found, false otherwise
' Originally recorded by WinWord macro recorder, probably contains
' quite a lot of useless code
'*********************************************************************
Function ReplaceH(ByVal ipNumber As Integer) As Boolean
    Dim sReplacement As String
    
    Select Case ipNumber
    Case 1: sReplacement = "#"
    Case 2: sReplacement = "##"
    Case 3: sReplacement = "###"
    Case 4: sReplacement = "####"
    Case 5: sReplacement = "#####"
    Case 6: sReplacement = "######"
    End Select
    
    Selection.Find.ClearFormatting
    Selection.Find.Style = ActiveDocument.Styles("Heading " & ipNumber)
    With Selection.Find
        .Text = ""
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    
   
     bReturn = False
    While Selection.Find.Execute = True
        bReturn = True
        Selection.Range.InsertBefore (vbCrLf & sReplacement & " ")
        Selection.Style = ActiveDocument.Styles("Normal")
        Selection.Find.Execute
    Wend
    
    ReplaceH = bReturn
End Function



'***************************************************************
' A fix-up for paragraph marks that ar are bold or italic
'***************************************************************
Sub RemoveBoldEnters()
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Font.Italic = True
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Font.Bold = False
    Selection.Find.Replacement.Font.Italic = False
    With Selection.Find
        .Text = "^p"
        .Replacement.Text = "^p"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Font.Bold = True
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Font.Bold = False
    Selection.Find.Replacement.Font.Italic = False
    With Selection.Find
        .Text = "^p"
        .Replacement.Text = "^p"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

'***************************************************************
' Function to replace bold with _bold_, only the first occurance
' Returns true if any occurance found, false otherwise
' Originally recorded by WinWord macro recorder, probably contains
' quite a lot of useless code
'***************************************************************
Sub ReplaceLists()
    Dim i As Integer
    Dim j As Integer
    Dim Para As Paragraph
        
    Selection.HomeKey Unit:=wdStory
    
    'iterate through all the lists in the document
    For i = Selection.Document.Lists.Count To 1 Step -1
        'check each paragraph in the list
        For j = Selection.Document.Lists(i).ListParagraphs.Count To 1 Step -1
            Set Para = Selection.Document.Lists(i).ListParagraphs(j)
            'if it's a bulleted list
            If Para.Range.ListFormat.ListType = wdListBullet Then
                        Para.Range.InsertBefore (ListIndent(Para.Range.ListFormat.ListLevelNumber, "*"))
            'if it's a numbered list
            ElseIf Para.Range.ListFormat.ListType = wdListSimpleNumbering Or _
                                                    wdListMixedNumbering Or _
                                                    wdListListNumOnly Then
                Para.Range.InsertBefore (Para.Range.ListFormat.ListValue & ".  ")
            End If
        Next j
        'inserts paragraph marks before and after, removes the list itself
        Selection.Document.Lists(i).Range.InsertParagraphBefore
        Selection.Document.Lists(i).Range.InsertParagraphAfter
        Selection.Document.Lists(i).RemoveNumbers
    Next i
End Sub

'***********************************************************
' Returns the MarkDown indent text
'***********************************************************
Function ListIndent(ByVal ipNumber As Integer, ByVal spChar As String) As String
    Dim i  As Integer
    For i = 1 To ipNumber - 1
        ListIndent = ListIndent & "    "
    Next
    ListIndent = ListIndent & spChar & "    "
End Function

Fuente: ProgTips

Si está dispuesto a usar el .docx formato, podría usar este script PHP que preparé que extraerá el XML, ejecutará algunas transformaciones XSL y generará un equivalente de Markdown bastante decente:

https://github.com/matb33/docx2md

Tenga en cuenta que está diseñado para funcionar desde la línea de comandos y es bastante básico en su interfaz. Sin embargo, hará el trabajo!

Si el guión no funciona lo suficientemente bien para ti, te animo a que me envíes tu .docx archivos para que pueda reproducir su problema y solucionarlo. Registre un problema en GitHub o contácteme directamente si lo prefiere.

  • +1, funciona bastante bien! Mejor que textutil + pandoc en mi caso (mantiene los encabezados notablemente)

    – lajarre

    15 de julio de 2013 a las 22:19

  • Creo que OP pidió .doc archivos Presumiblemente, esto no funciona en .docpero solo en .docx?

    – rien333

    28 oct 2019 a las 14:10

Pandoc es una buena herramienta de conversión de línea de comandos, pero nuevamente, primero deberá obtener la entrada en un formato que Pandoc pueda leer, que es:

  • reducción
  • Texto reestructurado
  • textil
  • HTML
  • Látex

avatar de usuario
janpaul123

Tuvimos el mismo problema de tener que convertir documentos de Word a rebajas. Algunos eran documentos más complicados y (muy) grandes, con ecuaciones matemáticas e imágenes y demás. Así que hice este script que convierte usando varias herramientas diferentes: https://github.com/Versal/word2markdown

Debido a que utiliza una cadena de varias herramientas, es un poco más propenso a errores, pero puede ser un buen punto de partida si tiene documentos más complicados. ¡Espero que pueda ser útil! 🙂

Actualizar:
Actualmente solo funciona en Mac OS X y debe tener algunos requisitos instalados (Word, Pandoc, HTML Tidy, git, node/npm). Para que funcione correctamente, también debe abrir un documento de Word vacío y hacer: Archivo->Guardar como página web->Compatibilidad->Codificación->UTF-8. Entonces esta codificación se guarda como predeterminada. Consulte el LÉAME para obtener más detalles sobre cómo configurar.

Luego ejecuta esto en la consola:

$ git clone git@github.com:Versal/word2markdown.git
$ cd word2markdown
$ npm install
(copy over the Word files, for example, "document.docx")
$ ./doc-to-md.sh document.docx document_files > document.md

Entonces puedes encontrar el Markdown en document.md e imágenes en el directorio document_files.

Tal vez sea un poco complicado ahora, por lo que agradecería cualquier contribución que lo haga más fácil o que funcione en otros sistemas operativos. 🙂

  • Incluya más detalles en su respuesta, ¿cómo usar esta herramienta para responder esta pregunta específica?

    – Calimó

    25/03/2014 a las 22:00

  • @Calimo Listo, gracias por la sugerencia. Respuesta SO por primera vez. 😉

    – janpaul123

    26 de marzo de 2014 a las 7:07

avatar de usuario
usuario626528

¿Has probado este? No estoy seguro acerca de la riqueza de funciones, pero funciona para textos simples.
http://markitdown.medusis.com/

  • Incluya más detalles en su respuesta, ¿cómo usar esta herramienta para responder esta pregunta específica?

    – Calimó

    25/03/2014 a las 22:00

  • @Calimo Listo, gracias por la sugerencia. Respuesta SO por primera vez. 😉

    – janpaul123

    26 de marzo de 2014 a las 7:07

avatar de usuario
Valentín

Como parte del curso ruby ​​de la universidad, desarrollé una herramienta que puede convertir archivos de Word de OpenOffice (.odt) a Markdown. Se deben hacer muchas suposiciones para convertirlo en el formato correcto. Por ejemplo, es difícil determinar el tamaño de un texto que debe considerarse como encabezado. Sin embargo, lo único que puede perder con esta conversión es que el formato de cualquier texto que se cumpla siempre se agrega al documento de rebajas. La herramienta que he desarrollado admite listas, texto en negrita y cursiva, y tiene sintaxis para tablas.

http://github.com/bostko/doc2text
Pruébalo y por favor dame tu opinión.

¿Ha sido útil esta solución?