web-dev-qa-db-fra.com

Convertir rapidement (.RTF | .doc) Fichiers à la syntaxe de marquage avec PHP

Je convertis manuellement des articles en syntaxe de Markdown pendant quelques jours et cela devient plutôt fastidieux. Certaines d'entre elles sont 3 ou 4 pages, italiques et autres textes inscrits. Existe-t-il un moyen plus rapide de convertir (.RTF | .doc) des fichiers à la syntaxe de marquage propre que je peux profiter?

41
Sampson

Si vous êtes sur un Mac, textutil _ fait un bon travail de conversion de DOC, DOCX et RTF en HTML et Pandoc fait un bon travail de convertir le HTML résultant au marquage:

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

J'ai un script que j'ai jeté ensemble un moment qui tente d'utiliser Textutil, PDF2HTML et Pandoc pour convertir tout ce que je jette à ce sujet à la marque.

92
David

Progtives a une solution possible avec une Macro Word) (téléchargement de source) :

A macro simple (téléchargement de source) pour convertir les choses les plus triviales automatiquement. Cette macro fait:

  • Remplacer audacieux et en italique
  • Remplacer les en-têtes (position marquée 1-6)
  • Remplacer les listes numérotées et à bulleted

C'est très buggy, je crois que cela se bloque sur des documents plus importants, mais je ne dis pas que c'est une libération stable de toute façon! :-) Utilisation expérimentale seulement, recodé et réutilisez-la comme vous le souhaitez, postez un commentaire si vous avez trouvé une meilleure solution.

Source: Progtives

Source macro

Installation

  • open Winword,
  • appuyez sur Alt + F11 pour ouvrir l'éditeur VBA,
  • cliquez avec le bouton droit sur le premier projet du navigateur de projet
  • choisissez Insertion-> Module
  • coller le code du fichier
  • fermer Editeur de macro
  • go Tools> Macro> Macros; Exécutez le marquage macro nommé

Source: Progtives

La source

Source macro pour la conservation de la sécurité si les protuges supprime le poste ou le site est éliminé:

'*** 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

Source: Progtives

11
Taj Moore

Si vous êtes ouvert à l'utilisation de la .docx Format, vous pouvez utiliser ceci PHP que je mets ensemble qui extraire le XML, exécutez des transformations XSL et de produire un équivalent de marquage bien décent:

https://github.com/matb33/docx2md

Notez qu'il est censé fonctionner à partir de la ligne de commande et est plutôt basique dans son interface. Cependant, cela fera le travail!

Si le script ne fonctionne pas assez bien pour vous, je vous encourage à m'envoyer votre .docx Fichiers afin que je puisse reproduire votre problème et résoudre le problème. Connectez-vous un problème dans GitHub ou contactez-moi directement si vous préférez.

8
matb33

Pandoc est un bon outil de conversion de ligne de commande, mais à nouveau, vous devez d'abord entrer l'entrée dans un format que Pandoc peut lire, ce qui est:

  • réduction
  • restructurétext
  • textile
  • Html
  • Latex
7
Mike Eng

Nous avons eu le même problème d'avoir à convertir des documents de mots en marquage. Certains étaient des documents plus compliqués et (très) importants, avec des équations de mathématiques et des images, etc. J'ai donc fait ce script qui convertit en utilisant un certain nombre d'outils différents: https://github.com/versal/word2markdown

Parce qu'il utilise une chaîne de plusieurs outils, il s'agit d'un peu plus d'erreur, mais cela peut être un bon point de départ si vous avez des documents plus compliqués. J'espère que ça peut être utile! :)

Mise à jour: Il fonctionne actuellement uniquement sur Mac OS X et vous devez disposer de certaines exigences installées (Word, Pandoc, HTML Tidy, Git, Node/NPM ). Pour fonctionner correctement, vous devez également ouvrir un document Word vide et faire: File-> Enregistrer sous WebPage-> Compatibilité-> Encodage-> UTF-8. Ensuite, cet encodage est enregistré par défaut. Voir le README pour plus de détails sur la manière de configurer.

Puis exécutez ceci dans la console:

$ git clone [email protected]: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

Ensuite, vous pouvez trouver le marquage dans document.md et images dans le répertoire document_files.

C'est peut-être un peu compliqué maintenant, alors j'accueillerais toutes les contributions qui facilitent la tâche ou de faire ce travail sur d'autres systèmes d'exploitation! :)

3
janpaul123

Avez-vous essayé celui-ci? Pas sûr de la richesse de la fonctionnalité, mais cela fonctionne pour des textes simples. http://marmitdown.medusis.com/

1
user626528

Dans le cadre de l'Université Ruby= Coursi, j'ai développé un outil pouvant convertir des fichiers Word OpenOffice (.odt) vers Markdown. Beaucoup d'hypothèses doivent être effectuées afin de le transformer en format correct. Par exemple, il est difficile de déterminer la taille d'un texte qui doit être considéré comme une rubrique. Cependant, les seuls pensent que vous pouvez perdre de cette conversion est le formatage de tout texte qui est rempli est toujours ajouté au document Markdown. L'outil i 'VE Développé des supports de support, du texte audacieux et italique, et il a la syntaxe des tables.

http://github.com/bostko/doc2text Donnez-lui un essai et s'il vous plaît donnez-moi vos commentaires.

0
Valentin