Слияние PDF увеличивает размер файла
Я объединяю несколько отдельных страниц PDF в один файл. Само слияние работает хорошо. Все страницы находятся в нужном месте, и они выглядят правильно.
Код слияния выглядит так:
CGContextRef writeContext = CGPDFContextCreateWithURL((CFURLRef)originalURL, NULL, NULL);
for(NSURL * pdfCacheURL in pdfURLs) {
singlePDFDocumentRef = CGPDFDocumentCreateWithURL((CFURLRef)pdfCacheURL);
pdfPage = CGPDFDocumentGetPage(singlePDFDocumentRef, 1);
mediaBox = CGPDFPageGetBoxRect(pdfPage, kCGPDFMediaBox);
CGContextBeginPage(writeContext, &mediaBox);
CGContextDrawPDFPage(writeContext, pdfPage);
CGContextEndPage(writeContext);
CGPDFPageRelease(pdfPage);
}
CGPDFContextClose(writeContext);
CFRelease(writeContext);
Странная вещь, которая происходит после слияния, заключается в том, что конечный документ имеет чрезвычайно большой размер файла, чем размеры файлов всех отдельных страниц вместе взятых.
Здесь часть моего вывода отладки
Processing Page: 1
File Size before merge:: 0.000000 mb
Single page length: 0.758951 mb
File Size after merge: 6.172294 mb
Processing Page: 2
File Size before merge: 6.172294 mb
Single page length: 0.262792 mb
File Size after merge: 6.722573 mb
Processing Page: 3
File Size before merge:: 6.722573 mb
Single page length: 0.215380 mb
File Size after merge: 8.150043 mb
Processing Page: 4
File Size before merge:: 8.150043 mb
Single page length: 0.346910 mb
File Size after merge: 10.788255 mb
Как вы можете видеть, после 4 страниц размер файла превышает 10 мегабайт, но объединенный размер файла составляет 1,58 мегабайта. Вы можете представить, что происходит, когда объединяются 100 страниц.
PDF-файлы содержат много изображений, но я не уверен, что это может быть причиной такого увеличения размера файла
1 ответ
Это результат того, как вы инициализируете CGPDFContextCreateWithURL((CFURLRef)originalURL, NULL, NULL);
Второй параметр mediaBox
который, по словам Apple, является
Прямоугольник, который определяет границы PDF. Начало прямоугольника обычно должно быть (0,0). Функция CGPDFContextCreateWithURL использует этот прямоугольник в качестве ограничивающего прямоугольника носителя по умолчанию. Если вы передадите NULL, CGPDFContextCreateWithURL будет использовать размер страницы по умолчанию 8,5 на 11 дюймов (612 на 792 точки).
Если ваш исходный файл меньше этого размера, он будет увеличен, потому что он будет нарисован на большем холсте. Вместо этого перейдите в меньший размер.
Вот ссылка на ссылку: CGPDFContext Reference