#ios #swift #pdfkit
#iOS #swift #pdfkit
Вопрос:
Размеры файлов захваченных 5 изображений составляют около 5 МБ каждое. Это должно быть в среднем 25 МБ, но размер файла PDF составляет около 120 МБ. В чем проблема?
let pdfDocument = PDFDocument()
var pageCount = 0
var originalSize = 0
// where images are picked from ImagePicker
for image in images {
let imgData = NSData(data: image.jpegData(compressionQuality: 1)!)
let imageSize: Int = imgData.count
originalSize = originalSize imageSize
if let jpgData = image.jpegData(compressionQuality: 0.75), let jpg = UIImage(data: jpgData) {
if let pdfPage = PDFPage(image: jpg) {
pdfDocument.insert(pdfPage, at: pageCount)
pageCount = 1
}
}
}
print("ORIGINAL IMAGE SIZE: %fMB", Double(originalSize) / 1000000)
let data = pdfDocument.dataRepresentation()
let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let docURL = documentDirectory.appendingPathComponent("Assignment-Docs.pdf")
print("PDF SIZE:" String(docURL.fileSize / 1000000) "MB")
Ответ №1:
Ну, на самом деле вы сравниваете здесь яблоки и апельсины. Сначала вы используете сжатие в формате jpeg здесь: NSData(data: image.jpegData(compressionQuality: 1)!)
, а затем вы используете данные в формате png здесь : if let pngData = image.pngData()
.
Это две совершенно разные вещи.
Вот ваш принятый код, который я использовал на игровой площадке:
let pdfDocument = PDFDocument()
var pageCount = 0
var originalSize = 0
let images: [UIImage] = [UIImage(named: "icke,jpg", in: .main, with: nil),
UIImage(named: "cat.jpg", in: .main, with: nil)].compactMap { $0 }
for image in images {
let imgData = NSData(data: image.jpegData(compressionQuality: 1)!)
let imageSize: Int = imgData.count
originalSize = originalSize imageSize
if let data = image.jpegData(compressionQuality: 0.75)/* image.pngData()*/, let image = UIImage(data: data) {
if let pdfPage = PDFPage(image: image) {
pdfDocument.insert(pdfPage, at: pageCount)
pageCount = 1
}
}
}
print("ORIGINAL IMAGE SIZE: (originalSize) Bytes")
let data = pdfDocument.dataRepresentation()
let documentDirectory = NSTemporaryDirectory()
let docURL = documentDirectory.appending("Assignment-Docs.pdf")
FileManager.default.createFile(atPath: docURL, contents: data, attributes: nil)
let fileData = try? Data(contentsOf: URL(fileURLWithPath: docURL))
print("PDF SIZE: (fileData!.count) Bytes")
Комментарии:
1. Первые 3 строки в цикле for предназначены только для определения размера исходного файла. Затем ниже я попытался изменить тип png или jpeg (0.75), но безуспешно.
2. Если я сделаю то, что вы сделали с небольшими изображениями, используя
image.pngData()
, я получу тот же результат, увеличив размер PDF-сайта примерно в два раза по сравнению с исходным размером. Если я изменю метод преобразования наimage.jpegData(compressionQuality: 1)
в обоих случаях, я получу почти одинаковые размеры. JPEG против PNG:ORIGINAL IMAGE SIZE: 57492 Bytes PDF SIZE: 116956 Bytes
JPEG @ 1 против JPEG @ 1:ORIGINAL IMAGE SIZE: 57492 Bytes PDF SIZE: 61567 Bytes
JPEG @ 1 против JPEG @ 0.75ORIGINAL IMAGE SIZE: 57492 Bytes PDF SIZE: 39212 Bytes