2016-08-03 10 views
-8

Я пытаюсь создать документ Word в моем приложении Swift; просто какой-то простой текст в определенном шрифте как файл .docx. Я не нашел способ создать текстовый документ, но лучше всего предположить, что я могу импортировать документ Word в свой проект Xcode только с текстом «Hello World», а затем в моем коде заменить каждое вхождение «Привет» Мир "с нужным текстом.Создать документ Word, Swift

Как я могу изменить текст файла .docx в моем быстром проекте?

Edit (вот почему мне это нужно): Я хочу создать .docx файл, так что пользователь может экспортировать любой текст типа в в приложение Google Docs или страницы приложения. Я понимаю использование UIDocumentInteractionController для экспорта существующих документов, но мне нужно выяснить, как я могу писать и сохранять текст в документе Word.

+3

Этот вопрос слишком широк и не подходит для переполнения стека. Единственная причина, по которой он еще не был закрыт, - это то, что причитается щедрость. – JAL

+1

Жаль, что вы не можете отметить плохой пост для закрытия, как только кто-то добавил ему щедрость. –

ответ

2

К сожалению, это практически невозможно создать .docx файл в Swift, учитывая, насколько сложно они (вы можете увидеть для себя, изменив расширение файла на любом старом .docx файл в .zip, который раскроет их внутреннюю структуру). Следующее лучшее - просто создать файл .txt, который также можно открыть в Pages (хотя, к сожалению, не Docs). Если вы ищете более отполированный формат, в комплекте с форматированием и, возможно, с изображениями, вы можете создать файл .pdf.


Вот некоторые примеры кода, которые могут оказать помощь:

Создание и обмен в .txt файл в Swift 3:

func export(_ string: String, title: String) throws { 
    // create a file path in a temporary directory 
    let fileName = "\(title).txt" 
    let filePath = (NSTemporaryDirectory() as NSString).appendingPathComponent(fileName) 

    // save the string to the file 
    try string.write(toFile: filePath, atomically: true, encoding: String.Encoding.utf8) 

    // open share dialog 

     // Initialize Document Interaction Controller 
    self.interactionController = UIDocumentInteractionController(url: URL(fileURLWithPath: filePath)) 
     // Configure Document Interaction Controller 
     self.interactionController!.delegate = self 
     // Present Open In Menu 
    self.interactionController!.presentOptionsMenu(from: yourexportbarbuttonoutlet, animated: true) // create an outlet from an Export bar button outlet, then use it as the `from` argument 
} 

Это можно назвать с

export("Hello World", title: "HelloWorld") 

, чтобы мгновенно создать txt и откройте диалог доступа к нему.


Создание и обмен простой .pdf файл в Swift 3:

func openPDF(_ string: String, title: String) throws { 
    // 1. Create a print formatter 

    let html = "<h2>\(title)</h2><br><h4>\(string)</h4>" // create some text as the body of the PDF with html. 

    let fmt = UIMarkupTextPrintFormatter(markupText: html) 

    // 2. Assign print formatter to UIPrintPageRenderer 

    let render = UIPrintPageRenderer() 
    render.addPrintFormatter(fmt, startingAtPageAt: 0) 

    // 3. Assign paperRect and printableRect 

    let page = CGRect(x: 10, y: 10, width: 595.2, height: 841.8) // A4, 72 dpi, x and y are horizontal and vertical margins 
    let printable = page.insetBy(dx: 0, dy: 0) 

    render.setValue(NSValue(cgRect: page), forKey: "paperRect") 
    render.setValue(NSValue(cgRect: printable), forKey: "printableRect") 

    // 4. Create PDF context and draw 

    let pdfData = NSMutableData() 
    UIGraphicsBeginPDFContextToData(pdfData, CGRect.zero, nil) 

    for i in 1...render.numberOfPages { 

     UIGraphicsBeginPDFPage(); 
     let bounds = UIGraphicsGetPDFContextBounds() 
     render.drawPage(at: i - 1, in: bounds) 
    } 

    UIGraphicsEndPDFContext(); 

    // 5. Save PDF file 

    var path = "\(NSTemporaryDirectory())\(title).pdf" 
    pdfData.write(toFile: path, atomically: true) 
    print("open \(path)") // check if we got the path right. 
     // open share dialog 
     print("opening share dialog") 
     // Initialize Document Interaction Controller 
     self.interactionController = UIDocumentInteractionController(url: URL(fileURLWithPath: path)) 
     // Configure Document Interaction Controller 
     self.interactionController!.delegate = self 
     // Present Open In Menu 
     self.interactionController!.presentOptionsMenu(from: yourexportbarbuttonoutlet, animated: true) // create an outlet from an Export bar button outlet, then use it as the `from` argument 
} 

Это можно назвать с

openPDF("Hello World", title: "HelloWorld") 

мгновенно создать файл PDF и откройте поделиться им.


Edit: Найдено интересный (хотя и не полируется) обходной путь, чтобы получить текст, чтобы открыть в Google Docs: использовать функцию из раздела «создание .txt файла» здесь, и просто изменить имя файла "\(title).docx". Это заставит Docs думать, что это документ .docx, который позволит открывать текст в Документах успешно. К сожалению, это создает недопустимый документ, который не может быть открыт Pages, Word или действительно любым другим приложением, потому что он не фактически создает реальный файл документа. И контроллер взаимодействия заставит его посмотреть на пользователя, как и открыть его в Странице, хотя это неизменно терпит неудачу.

+0

Хотя вы действительно не решали общую проблему здесь, вы предложили хорошее объяснение и некоторые достойные альтернативы, так что вот некоторые интернет-точки. – owlswipe

+0

@JohnRamos Да, это немного неудачно, но это действительно единственный ответ, который я мог найти. –

+0

Удивительный пост! Большое спасибо за учебник pdf! – LinusGeffarth

0

Вы не можете напрямую «редактировать текст» в документе Word. Файл .docx на самом деле является файлом ZIP с определенной структурой файлов/папок внутри (попробуйте переименовать его в .zip &, извлеките его, и вы увидите), который соответствует формату «Office Open XML» (https://en.wikipedia.org/wiki/Office_Open_XML).

Если нет библиотек для изменения формата Office OpenXML в Swift, вам просто нужно прибегнуть к написанию кода самостоятельно. Однако, если у вас есть простые требования (только какой-то простой текст, как вы заявляете), это не должно быть слишком сложным.

Microsoft имеет библиотеку OpenXML в GitHub по адресу https://github.com/OfficeDev/Open-XML-SDK, которая может быть вам полезной.

+0

Я не нашел никаких библиотек. Если бы вы могли указать мне на соответствующий файл проекта Github, это было бы очень здорово (оно настолько массивное). – owlswipe

+0

Да, это довольно большой ... у них много классов для всех элементов, а также их анализ и добавление ограничений. Это займет немного, чтобы собрать все это вместе. Другими параметрами являются сохранение базового файла DOCX и вид обратного инженера/выяснение того, что вам нужно будет изменить. –

-1

Учитывая, что вы указываете пользователя, желающего перенести документы в Документы Google, вы можете рассмотреть возможность работы с форматом RTF. Вы также можете экспортировать файл docx в формат RTF, работать над этим и, когда это будет сделано, импортировать измененный RTF-файл непосредственно в документы Google.

Я предлагаю это, так как RTF также является работоспособным открытым форматом: см. https://www.safaribooksonline.com/library/view/rtf-pocket-guide/9781449302047/ch01.html. Основываясь на этой ссылке, вы можете создать этот простой (ASCII) вывод:

{\rtf1\ansi\deff0 {\fonttbl {\f0 Verdana;}} 
\f0\fs16 
Hello World! 
} 

и сохранить его в виде файла с расширением .rtf.

+0

Хорошо, я могу успешно создать и предоставить общий доступ к файлу rtf, но UIDocumentInteractionController не имеет Open In Pages или Open In Docs в качестве параметров, в отличие от txt-файла, который по крайней мере имеет страницы в качестве опции. Что я могу сделать, чтобы заставить страницы открыть rtf? И я знаю, что правильно создаю файл, потому что, когда я экспортирую его на свой Mac через airdrop, он выглядит великолепно. – owlswipe

+0

Страницы не могут открывать RTF. Не могут также Документы. Поэтому, хотя я могу успешно сделать RTF с этим, я не могу его открыть. – owlswipe

+0

Хорошо, я не знал, что ни страницы, ни документы не могут открывать RTF-файлы. –

Смежные вопросы