Чтение содержимого файла DOC (.docx или .doc) и преобразование его в строку

Мне нужна помощь в чтении содержимого файла DOC (.docx или .doc) и отображении его внутри UILabel. Файл находится по URL-адресу, поэтому я загружаю файл в DocumentsDirectory и в процессе поиска решения читаю содержимое.

Я использую Alamofire.download и я позвонил:

let content = try? String(contentsOfFile: (response.destinationURL?.path)!, encoding: String.Encoding.utf8)

но он возвращает nil

Кто-нибудь знает, как читать содержимое файла документа, будет признателен.


person Law Gimenez    schedule 13.05.2018    source источник
comment
попробуйте заменить String.Encoding.utf8 на String.Encoding.ascii   -  person a.masri    schedule 13.05.2018
comment
@ A.masri Я использовал .ancii, и я получаю много персонажей, таких как ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ u {01} \ 0þÿ \ u {03} \ n \ 0 \ 0ÿÿÿÿ \ u {06} \ t \ u {02   -  person Law Gimenez    schedule 13.05.2018
comment
@LawGimenez: не все файлы можно перевести как строку. Просто попробуйте прочитать UIImage как строку, у вас не получится. Вы можете распечатать шестнадцатеричные данные, но это не делается для этого. .doc и .docx являются частным форматом. Вы можете найти библиотеки для этого (если вы хотите хорошую, вам, возможно, придется заплатить за нее). Обычно UIWebView может их отображать.   -  person Larme    schedule 13.05.2018


Ответы (1)


Вы можете использовать этот SNDocx.

OR

Сделать это не так просто, как вы себе представляете, файл docx представляет собой заархивированную коллекцию XML и других файлов. Вы не можете загрузить файл docx в файл String. Вам нужно будет использовать Data для загрузки содержимого zip. Тогда вам нужно будет unzip его. Затем вам нужно будет просмотреть все файлы и найти нужный word/document.xml, затем прочитать xml и проанализировать.

Я использую Zippy

Посмотрите этот код

 guard let originalFileURL = Bundle.main.url(forResource: "test", withExtension: "docx") else {
            print("file not found :( ")
            return
        }
     do{

           let filename = try! ZipFile.init(url: originalFileURL)
            // file name  content 
            //            - 0 : "[Content_Types].xml"
            //            - 1 : "word/numbering.xml"
            //            - 2 : "_rels/.rels"
            //            - 3 : "word/theme/theme1.xml"
            //            - 4 : "word/fontTable.xml"
            //            - 5 : "word/document.xml"
            //            - 6 : "word/settings.xml"
            //            - 7 : "word/styles.xml"
            //            - 8 : "word/_rels/document.xml.rels"

            for file in filename {
                if file.contains("document.xml"){
                    let data = filename[file]
                    print(String.init(data: data!, encoding: String.Encoding.utf8))
                }
            }

        }catch{
            print(error)
        }

Вывод

<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r<w:document xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:sl=\"http://schemas.openxmlformats.org/schemaLibrary/2006/main\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\" xmlns:c=\"http://schemas.openxmlformats.org/drawingml/2006/chart\" xmlns:lc=\"http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas\" xmlns:dgm=\"http://schemas.openxmlformats.org/drawingml/2006/diagram\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"><w:body><w:p w:rsidR=\"00000000\" w:rsidDel=\"00000000\" w:rsidP=\"00000000\" w:rsidRDefault=\"00000000\" w:rsidRPr=\"00000000\" w14:paraId=\"00000000\"><w:pPr><w:contextualSpacing w:val=\"0\"/><w:rPr/></w:pPr><w:r w:rsidDel=\"00000000\" w:rsidR=\"00000000\" w:rsidRPr=\"00000000\"><w:rPr><w:rtl w:val=\"0\"/></w:rPr><w:t xml:space=\"preserve\">test</w:t></w:r></w:p><w:sectPr><w:pgSz w:h=\"15840\" w:w=\"12240\"/><w:pgMar w:bottom=\"1440\" w:top=\"1440\" w:left=\"1440\" w:right=\"1440\" w:header=\"0\"/><w:pgNumType w:start=\"1\"/></w:sectPr></w:body></w:document>

Вы должны проанализировать xml это, и вы обнаружите в моем выводе, что он должен быть проанализирован, пока это значение не будет получено.

<w:t xml:space=\"preserve\">test</w:t>

справочник по формату docx XML

person a.masri    schedule 13.05.2018
comment
Можете ли вы объяснить мне, что ошибка броска сделана в любой строке кода? - person a.masri; 14.05.2018
comment
может быть, это потому, что файл является документом doc, а не docx - person Law Gimenez; 14.05.2018
comment
позволь мне проверить - person a.masri; 14.05.2018
comment
@LawGimenez Извините, но как объяснить мне разницу между doc и docx, вы не можете читать doc. Вы должны преобразовать doc в docx, чтобы мы могли прочитать содержимое. - person a.masri; 14.05.2018
comment
да, я так и думал, я приму этот ответ, как только получу подтверждение с помощью docx - person Law Gimenez; 14.05.2018