2016-06-08 106 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