В iOS PDFPage (изображение: изображение) увеличивает размер файла PDF. Как решить эту проблему?

#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.75 ORIGINAL IMAGE SIZE: 57492 Bytes PDF SIZE: 39212 Bytes