Я закончу, это мой код
func SavePdfUser () {
// Create page rect
let pageRect = CGRect(x: 0, y: 0, width: 595.28, height: 841.89) // A4, 72 dpi
// Create PDF context and draw
let pdfData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfData, pageRect, nil)
UIGraphicsBeginPDFPage()
// From here you can draw page, best make it in a function
PdfErstellung.PdfErstellen(auswahlZeilen, vitalstoffWerteListe, heuteString)
UIGraphicsEndPDFContext()
// Save pdf DATA through user
let activityViewController = UIActivityViewController(activityItems: [pdfData], applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.view // für IPAD nötig
self.present(activityViewController, animated: true, completion: nil)
// save temporary for preview
let dateiName = "Vitalstoffwerte " + heuteString
let fileUrl = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(dateiName).pdf")
do {
try pdfData.write(to: fileUrl, options: .atomic)
} catch {
print(error,"file not save")
}
// Preview
let webview = WKWebView(frame: UIScreen.main.bounds)
view.addSubview(webview)
webview.load(URLRequest(url: fileUrl))
}
import UIKit import Foundation
class PdfErstellung {
static func PdfErstellen(_ auswahlZeilen : [LebensmittelDataTV], _ vitalstoffWerteListe : [LebensmittelDataTV], _ heuteString : String) {
var y = 0 // Points from above - von oben
var x = 0 // Points form left - von links
var width = 0 // length of rect - länge vom rechteck
var height = 0 // height of rect - höhe vom rechteck
var stringRechteck = CGRect(x: x, y: y, width: width, height: height) // make rect for text - rechteck für Text
var paragraphStyle = NSMutableParagraphStyle() // text alignment - text ausrichtung
var font = UIFont(name: "HelveticaNeue-Bold", size: 10.0) // Important: the font name must be written correct - Wichtig: Textname muss korrekt geschrieben werden
var text = ""
let attributes = [
NSAttributedString.Key.paragraphStyle: paragraphStyle,
NSAttributedString.Key.font: font,
NSAttributedString.Key.foregroundColor: UIColor.black
]
// Title - ÜBERSCHRIFT
font = UIFont(name: "HelveticaNeue-Bold", size: 20.0)
text = "Tagesbedarf in % vom " + heuteString // heuteString = date/datum
paragraphStyle.alignment = .left
x = 50; y = 30; width = 300; height = 40
stringRechteck = CGRect(x: x, y: y, width: width, height: height)
text.draw(in: stringRechteck, withAttributes: attributes)
// List - Vitalstoffwerte Liste
y = 45
for zeile in 0..<vitalstoffWerteListe.count {
let druckenVitalstoffWerte = vitalstoffWerteListe[zeile]
if druckenVitalstoffWerte.zeilenInfoID == 0 { // Title - Überschrift
y = y + 5 // distance to above becaus is title - Abstand nach oben, weil Überschrift
x = 50; width = 80; height = 20
stringRechteck = CGRect(x: x, y: y, width: width, height: height)
font = UIFont(name: "HelveticaNeue-Bold", size: 10.0) // change font - verändere schrift
text = druckenVitalstoffWerte.name
text.draw(in: stringRechteck, withAttributes: attributes)
font = UIFont(name: "HelveticaNeue", size: 8.0) // change font back - schrift zurück ändern
} else { // or detail
x = 50; width = 90; height = 20
stringRechteck = CGRect(x: x, y: y, width: width, height: height)
text = druckenVitalstoffWerte.name
text.draw(in: stringRechteck, withAttributes: attributes)
x = 150; width = 40
stringRechteck = CGRect(x: x, y: y, width: width, height: height)
text = druckenVitalstoffWerte.anzahl
paragraphStyle.alignment = .right
text.draw(in: stringRechteck, withAttributes: attributes)
paragraphStyle.alignment = .left
x = 195; width = 20
stringRechteck = CGRect(x: x, y: y, width: width, height: height)
text = druckenVitalstoffWerte.masse
text.draw(in: stringRechteck, withAttributes: attributes)
}
y = y + 10 // 10 down for next line - 10 nach unten für nächste Zeile
}
// Title - Überschrift
x = 220; y = 50; width = 100; height = 20
text = "Lebensmittel"
font = UIFont(name: "HelveticaNeue-Bold", size: 8.0)
paragraphStyle.alignment = .left
stringRechteck = CGRect(x: x, y: y, width: width, height: height)
text.draw(in: stringRechteck, withAttributes: attributes)
font = UIFont(name: "HelveticaNeue", size: 8.0)
// List - Lebensmittelliste
y = 60
for zeile in 0..<auswahlZeilen.count {
let auswahlZeilenObjekt = auswahlZeilen[zeile]
x = 220; width = 90; height = 20
stringRechteck = CGRect(x: x, y: y, width: width, height: height)
text = auswahlZeilenObjekt.name
text.draw(in: stringRechteck, withAttributes: attributes)
x = 320; width = 40
stringRechteck = CGRect(x: x, y: y, width: width, height: height)
text = auswahlZeilenObjekt.anzahl
paragraphStyle.alignment = .right
text.draw(in: stringRechteck, withAttributes: attributes)
paragraphStyle.alignment = .left
x = 365; width = 20
stringRechteck = CGRect(x: x, y: y, width: width, height: height)
text = auswahlZeilenObjekt.masse
text.draw(in: stringRechteck, withAttributes: attributes)
y = y + 10
if zeile == 75 { // 76 items - Zeilen
break
}
}
y = 60
if auswahlZeilen.count > 75 { // new
for zeile in 76..<auswahlZeilen.count {
let auswahlZeilenObjekt = auswahlZeilen[zeile]
x = 390; width = 90; height = 20
stringRechteck = CGRect(x: x, y: y, width: width, height: height)
text = auswahlZeilenObjekt.name
text.draw(in: stringRechteck, withAttributes: attributes)
x = 490; width = 40
stringRechteck = CGRect(x: x, y: y, width: width, height: height)
text = auswahlZeilenObjekt.anzahl
paragraphStyle.alignment = .right
text.draw(in: stringRechteck, withAttributes: attributes)
paragraphStyle.alignment = .left
x = 535; width = 20
stringRechteck = CGRect(x: x, y: y, width: width, height: height)
text = auswahlZeilenObjekt.masse
text.draw(in: stringRechteck, withAttributes: attributes)
y = y + 10
if zeile == 151 { // 76 items - Zeilen
break
}
}
}
}
}
- РЕДАКТИРОВАТЬ - Проблема только в IOS 12.
Не знаю почему, но в каком-то симуляторе: я могу создать файл и дать URLв UIActivityViewController, и у меня есть собственное имя файла, а в другом URL-адрес не удается, и я должен дать pdfData напрямую.
Моя идея: сначала я попробую URL, и если это не удастся, тогда я дам pdfData
do {
let dateiName = "Vitalstoffwerte " + heuteString
let fileUrl = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(dateiName).pdf")
do {
try pdfData.write(to: fileUrl, options: .atomic)
} catch {
print(error,"file not save")
}
let activityViewController = UIActivityViewController(activityItems: [fileUrl], applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.view // für IPAD nötig
self.present(activityViewController, animated: true, completion: nil)
} catch {
let activityViewController = UIActivityViewController(activityItems: [pdfData], applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.view // für IPAD nötig
self.present(activityViewController, animated: true, completion: nil)
}
Моя проблема в том, как я могу узнать, пользователь мог сохранить файл или нет(если бы он попробовал), могу ли я спросить после кода ошибки в журнале?do, catch не отправляются.
2018-09-25 15: 36: 55.787894 + 0200 Vitalstoffcontroller [8656: 186334] [по умолчанию] [ОШИБКА] Не удалось определить, является ли URL / Users / lukashedinger / Library /Разработчик / CoreSimulator / Устройства / 45A185C5-6DEA-4A52-B415-939758FB7F7E / данные / контейнеры / данные / приложение / 2469BE4A-53B2-4545-B5D7-E64FBCDB383E / tmp / Vitalstoffwerte 25092018-25092018.pdf управляется файлом (файл v15082018.pdf)провайдер 2018-09-25 15: 36: 56.312499 + 0200 Vitalstoffcontroller [8656: 186334] [ShareSheet] отменил запрос - ошибка: операция не может быть завершена.Недопустимый аргумент
- РЕДАКТИРОВАТЬ -
ma временное решение - в ios12 я передаю данные в UIActivityViewController, в противном случае я сохраняю данные в виде файла и даю URL-адрес для UIActivityViewController.
if #available(iOS 12.0, *) {
let activityViewController = UIActivityViewController(activityItems: [pdfData], applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.view // für IPAD nötig
self.present(activityViewController, animated: true, completion: nil)
} else {
let dateiName = "Vitalstoffwerte " + heuteString
let fileUrl = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(dateiName).pdf")
do {
try pdfData.write(to: fileUrl, options: .atomic)
} catch {
print(error,"file not save")
}
let activityViewController = UIActivityViewController(activityItems: [fileUrl], applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.view // für IPAD nötig
self.present(activityViewController, animated: true, completion: nil)
}