Я столкнулся с этим, пытаясь собрать простой скрипт Automator для объединения нескольких одностраничных PDF-файлов. У меня было 88 файлов для объединения, каждый примерно по 300 КБ, поэтому я ожидал, что конечный продукт будет около 30 МБ; результирующий файл PDF с использованием действия «Объединить PDF-файлы» имел размер 300 + МБ.
В действии Automator используется сценарий Python с привязками Foundation для создания нового документа PDF с API-интерфейсами CoreGraphics PDF. Ничто не кажется неуместным. По сути, он делает это (упрощенно, но это основные моменты):
writeContext = CGPDFContextCreateWithURL(outURL, None, None)
for url in inURLs:
doc = CGPDFDocumentCreateWithURL(url)
page = CGPDFDocumentGetPage(doc, 1)
mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox)
CGContextBeginPage(writeContext, mediaBox)
CGContextDrawPDFPage(writeContext, page)
CGContextEndPage(writeContext)
CGPDFContextClose(writeContext)
Я не могу себе представить, что CGContextDrawPDFPage, при рисовании в контексте PDF, будет делать что угодно, только не копировать данные PDF для этой страницы (с некоторыми изменениями окна).
Даже при «объединении» только одного PDF-файла размер файла составляет 2,8 МБ по сравнению с оригинальным одностраничным PDF-файлом объемом 300 КБ.
Полученные PDF-файлы выглядят точно так же постранично, как и исходные страницы: текст выбирается в тех же местах, графика выглядит одинаково, страницы имеют одинаковый размер.
Есть идеи?