Ios 将PDF转换为单页PDF原因是PDF页面的页高不同

Ios 将PDF转换为单页PDF原因是PDF页面的页高不同,ios,objective-c,pdf,pdf-generation,Ios,Objective C,Pdf,Pdf Generation,我有一个PDF,我想把它缩小到一页 这不起作用: //pages size_t pages = CGPDFDocumentGetNumberOfPages(document); pageRect.size.height = pageRect.size.height*pages; CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData(mutableData); CGContextRef pdfContext = CGPDFC

我有一个PDF,我想把它缩小到一页

这不起作用:

//pages
size_t pages = CGPDFDocumentGetNumberOfPages(document);
pageRect.size.height = pageRect.size.height*pages;
CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData(mutableData);
CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &pageRect, NULL);

CGPDFContextBeginPage(pdfContext, NULL);
for (int i =1; i<=pages; i++)
{
   CGPDFPageRef pageRef = CGPDFDocumentGetPage(document, i);
   CGContextDrawPDFPage(pdfContext, pageRef);
}
CGPDFContextEndPage(pdfContext);
//页
页面大小=CGPDFDocumentGetNumberOfPages(文档);
pageRect.size.height=pageRect.size.height*页面;
CGDataConsumerRef dataConsumer=CGDataConsumerCreateWithCFData(可变数据);
CGContextRef pdfContext=CGPDFContextCreate(dataConsumer,&pageRect,NULL);
CGPDFContextBeginPage(pdfContext,NULL);

对于(int i=1;i您的代码在同一位置打印所有页面,一页一页地打印在另一页上。如果页面有明显的白色背景,则您将只看到最后一页。
解决方案是在绘制页面后,使用已绘制页面的高度平移坐标系。
更新:这是完整的代码。它假定源文件中的所有页面具有相同的大小和旋转:

NSURL *pdfURL = [[NSBundle mainBundle] URLForResource:@"source.pdf" withExtension:nil];
pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);

int pageCount = CGPDFDocumentGetNumberOfPages(pdf);
CGPDFPageRef pageRef = CGPDFDocumentGetPage(pdf, 1);
CGRect pageRect = CGPDFPageGetBoxRect(pageRef, kCGPDFMediaBox);
float pageHeight = pageRect.size.height;
pageRect.size.height = pageRect.size.height * pageCount;

NSMutableData* pdfData = [[NSMutableData alloc] init];
CGDataConsumerRef pdfConsumer = CGDataConsumerCreateWithCFData((CFMutableDataRef)pdfData);
CGContextRef pdfContext = CGPDFContextCreate(pdfConsumer, &pageRect, NULL);

CGPDFContextBeginPage(pdfContext, NULL);
CGContextTranslateCTM(pdfContext, 0, pageRect.size.height);
for (int i = 1; i <= pageCount; i++) {
    pageRef = CGPDFDocumentGetPage(pdf, i);
    CGContextTranslateCTM(pdfContext, 0, -pageHeight);
    CGContextDrawPDFPage(pdfContext, pageRef);
}
CGPDFContextEndPage(pdfContext);
CGPDFContextClose(pdfContext);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pdfFile = [documentsDirectory stringByAppendingPathComponent:@"destination.pdf"];

[pdfData writeToFile: pdfFile atomically: NO];
[pdfData release];
NSURL*pdfURL=[[NSBundle mainBundle]URLForResource:@“source.pdf”,扩展名为nil];
pdf=CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
int pageCount=CGPDFDocumentGetNumberOfPages(pdf);
CGPDFPageRef pageRef=CGPDFDocumentGetPage(pdf,1);
CGRect pageRect=CGPDFPageGetBoxRect(pageRef,kCGPDFMediaBox);
float pageHeight=pageRect.size.height;
pageRect.size.height=pageRect.size.height*pageCount;
NSMutableData*pdfData=[[NSMutableData alloc]init];
CGDataConsumerRef pdfConsumer=CGDataConsumerCreateWithCFData((CFMutableDataRef)pdfData);
CGContextRef pdfContext=CGPDFContextCreate(pdfConsumer,&pageRect,NULL);
CGPDFContextBeginPage(pdfContext,NULL);
CGContextTranslateCm(pdfContext,0,pageRect.size.height);

对于(int i=1;i到底什么不起作用?谢谢你的评论。iPDFdev作为你在PDF中的解决方案非常好。只有最后一页是以整个PDF打印的,我想将当前PDF的所有页面都打印到一个页面。这个问题对其他用户很有用,因为没有人问过关于这些想法的问题。这类问题没有答案。但是credit转到@iPDFDev。请打开此问题。请在+1上指导我谢谢你的回答。在绘制页面后,我如何翻译坐标系?完美答案非常感谢@iPDFDev