Вопрос по php – Быстрое преобразование файлов (.rtf | .doc) в синтаксис уценки с помощью PHP

40

Я уже несколько дней вручную конвертирую статьи в синтаксис Markdown, и это становится довольно утомительным. Некоторые из них - 3 или 4 страницы, курсив и другой выделенный текст повсюду. Есть ли более быстрый способ конвертировать (.rtf | .doc) файлы в чистый синтаксис Markdown, который я могу использовать в своих интересах?

Ваш Ответ

7   ответов
11

ProgTips имеет возможное решение сСлово макрос(source download):

A simple macro (source download) for converting the most trivial things automatically. This macro does:

Replace bold and italics Replace headings (marked heading 1-6) Replace numbered and bulleted lists

It's very buggy, I believe it hangs on larger documents, however I'm NOT stating it's a stable release anyway! :-) Experimental use only, recode and reuse it as you like, post a comment if you've found a better solution.

Источник:ProgTips

Macro source Installation open WinWord, press Alt+F11 to open the VBA editor, right click the first project in the project browser choose insert->module paste the code from the file close macro editor go tools>macro>macros; run the macro named MarkDown

Источник:ProgTips

Source

Макроисточник для безопасного хранения, если ProgTips удалит сообщение или сайт будет уничтожен:

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

Источник:ProgTips

1

но он работает для простых текстов. http://markitdown.medusis.com/

3

rd в уценку. Некоторые были более сложными и (очень) большими документами с математическими уравнениями и изображениями и тому подобным. Итак, я сделал этот скрипт, который конвертирует с использованием ряда различных инструментов:https://github.com/Versal/word2markdown

Поскольку он использует цепочку из нескольких инструментов, он более подвержен ошибкам, но может быть хорошей отправной точкой, если у вас есть более сложные документы. Надеюсь, что это может быть полезно! :)

Update: В настоящее время он работает только на Mac OS X, и вам необходимо установить некоторые требования (Word, Pandoc, HTML Tidy, git, node / npm). Чтобы он работал правильно, вам также нужно открыть пустой документ Word и выполнить: File-> Save As Webpage-> Compatibility-> Encoding-> UTF-8. Затем эта кодировка сохраняется по умолчанию. Смотрите README для более подробной информации о том, как настроить.

Затем запустите это в консоли:

$ 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

Тогда вы можете найти уценку вdocument.md и изображения в каталогеdocument_files.

Сейчас это, возможно, немного сложно, поэтому я хотел бы приветствовать любой вклад, который сделает это проще или сделает это работающим на других операционных системах! :)

Пожалуйста, включите более подробную информацию в свой ответ, как использовать этот инструмент, чтобы ответить на этот конкретный вопрос?
@ Calimo Готово, спасибо за предложение. Первый раз ТАК отвечу. ;-)
0

который может конвертировать файлы слов openoffice (.odt) в уценку. Необходимо сделать много предположений для того, чтобы привести его к правильному форматированию. Например, трудно определить размер текста, который должен рассматриваться как заголовок. Однако единственная мысль, которую вы можете потерять при этом преобразовании, - это форматирование любого встречаемого текста, всегда добавляемого к документу уценки. Инструмент, который я разработал, поддерживает списки, текст, выделенный жирным шрифтом и курсивом, и имеет синтаксис для таблиц.

http://github.com/bostko/doc2text Попробуйте и пожалуйста, дайте мне свой отзыв.

90

textutil хорошо выполняет преобразование doc, docx и rtf в html, а pandoc хорошо выполняет преобразование полученного html в уценку:

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

у меня естьскрипт что я отбросил некоторое время назад, пытаясь использовать textutil, pdf2html и pandoc, чтобы конвертировать все, что я выбрасываю, в уценку.

Блестящее спасибо! Я обнаружил, что должен был использовать:textutil -convert html file.doc -stdout | pandoc -f html -t markdown -o file.md
Я попробовал это, но это добавило разрывы строк в копию.
Я только что попробовал это для преобразования из Word в уценку, и это сработало чудесно. Благодарю.
textutil только для Mac OS X. Некоторые альтернативы Linux перечислены наunix.stackexchange.com: GNU unrtf, Pandoc а такжеunoconv.
9

.docx формат, вы можете использовать этот PHP-скрипт, который я соберу, который будет извлекать XML, запускать некоторые XSL-преобразования и выводить довольно приличный эквивалент Markdown:

https://github.com/matb33/docx2md

Обратите внимание, что он предназначен для работы из командной строки и довольно прост в своем интерфейсе. Тем не менее, это сделает работу!

Если сценарий не работает достаточно хорошо для вас, я призываю вас прислать мне.docx файлы, чтобы я мог воспроизвести вашу проблему и исправить ее. Зарегистрируйте проблему в GitHub или свяжитесь со мной напрямую, если хотите.

+1, работает довольно хорошо! Приятнее, что textutil + pandoc в моем случае (особенно заметны заголовки)
7

Pandoc является хорошим средством преобразования командной строки, но опять же, вам сначала нужно получить ввод в формате, который может прочитать Pandoc, а именно:

Pandoc теперь может читать Microsoft Word DOCX, ODT, OpenDocument и другие форматы.
Пандок, кажется, не читает rtf, только пишет его.

Похожие вопросы