К сожалению, это практически невозможно создать .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 или действительно любым другим приложением, потому что он не фактически создает реальный файл документа. И контроллер взаимодействия заставит его посмотреть на пользователя, как и открыть его в Странице, хотя это неизменно терпит неудачу.
Этот вопрос слишком широк и не подходит для переполнения стека. Единственная причина, по которой он еще не был закрыт, - это то, что причитается щедрость. – JAL
Жаль, что вы не можете отметить плохой пост для закрытия, как только кто-то добавил ему щедрость. –