2016-06-08 50 views
0

我合併幾個單一的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文件包含大量的圖片,但我不知道這可能是負責這種增加文件大小

回答

0

這是要初始化CGPDFContextCreateWithURL((CFURLRef)originalURL, NULL, NULL);

第二個參數方法的結果是根據Apple的mediaBox,它是

指定PDF邊界的矩形。矩形的原點通常應該是(0,0)。 CGPDFContextCreateWithURL函數使用此矩形作爲默認頁面媒體邊界框。如果傳遞NULL,CGPDFContextCreateWithURL將使用8.5 x 11英寸(612 x 792點)的默認頁面大小。

如果您的原始文件比這個尺寸小,它將會增加,因爲它會在更大的畫布上繪製。代之以傳遞更小的尺寸。

這裏是鏈接到參考:CGPDFContext Reference

+0

感謝您的回答,但不幸的是,這不是問題。兩個文檔上的邊界框相同。 發佈此問題後,我發現這個http://stackoverflow.com/questions/3099312/why-does-combining-pdf-pages-with-cgcontextdrawpdfpage-create-very-large-output 其中@qwzybug指出,CGPDFContext會將jpgs轉換爲原始位圖。我還沒有找到確認,但這將是一個解釋。 但後來不知道我怎麼能解決這個問題。 – MatzeLoCal

+0

噢好吧,所以我想這可能是一個解決問題。也許試圖找到一種方法來降低分辨率 – Anton