Печать PDF с использованием AirPrint приводит к обрезке содержимого
Здесь я печатаю PDF с размером 'pageSize = CGSizeMake(640, 832);'. этот размер больше, чем размер страницы А4. поэтому я обрежу некоторый текст (означает, что он не напечатает всю страницу).
при печати того же PDF-файла с использованием MAC-адреса будет распечатана вся страница с помощью опции (масштабирование по размеру). так что любой может помочь мне выйти из этой проблемы... есть ли вариант в IOS SDK для масштабирования, чтобы соответствовать.
вот мой код..
-(void)printItem
{
NSArray *aArrPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) ;
NSString *aStr = [[aArrPaths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"PropertyReport_%d.pdf",self.propertyId]];
// NSString *aStr = [[NSBundle mainBundle] pathForResource:@"TRADUZIONE HELP SECTIONS REV2" ofType:@"pdf"];
NSURL *url=[[NSURL alloc] initFileURLWithPath:aStr];
NSData *data=[[NSData alloc] initWithContentsOfURL:url];
printController = [UIPrintInteractionController sharedPrintController];
if(printController && [UIPrintInteractionController canPrintData:data])
{
printController.delegate = self;
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGeneral;
//printInfo.jobName = [NSString stringWithFormat:@"New Image"];
printInfo.duplex = UIPrintInfoDuplexLongEdge;
printController.printInfo = printInfo;
printController.showsPageRange = YES;
printController.printingItem = data;
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error)
{
if (!completed && error)
{
//NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code);
}
};
// aWebViewPDF.hidden=FALSE;
[printController presentAnimated:YES completionHandler:completionHandler];
}
}
Спасибо!
2 ответа
Как бы странно это ни звучало, попробуйте:
printController.showsPageRange = NO;
Похоже, это включает автоматическое масштабирование, но иногда печатает дополнительную пустую страницу в конце работы. AirPrint в основном колдовство.
У вас есть только один вариант, чтобы scale down
к ratio
из printed format
со всех страниц PDF, а затем распечатайте его. Я сделал, это получил все страницы pdf into images
и уменьшил это до требования:
NSString *strFilePath = [[NSBundle mainBundle] pathForResource:@"pdftouch" ofType:@"pdf"];
pic.printingItems = [[self allPagesImageFromPDF:strFilePath] copy];
Добавьте все три метода:
Convert all PDF pages into UIImages
-(NSMutableArray *)allPagesImageFromPDF:(NSString *)strPath
{
NSMutableArray *arrImages = [NSMutableArray array];
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:strPath]);
NSInteger numberOfPages = CGPDFDocumentGetNumberOfPages(pdf);
for (NSInteger pageIndex = 1; pageIndex <= numberOfPages;
pageIndex++)
{
UIImage *img = [self getThumbForPage:pdf pageIndex:pageIndex];
[arrImages addObject:[self resizedImage:img]];
}
return arrImages;
}
Resize images
-(UIImage *)resizedImage:(UIImage *)image
{
UIGraphicsBeginImageContext(CGSizeMake(612, 792)); //A4 size
[image drawInRect:CGRectMake(0,0,612, 792)]; //A4 size
UIImage *resizedImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resizedImg;
}
Get UIImage from CGPDFPageRef
-(UIImage *)getThumbForPage:(CGPDFDocumentRef)pdfRef pageIndex:(int)page_number{
// Get the page
CGPDFPageRef myPageRef = CGPDFDocumentGetPage(pdfRef, page_number);
// Changed this line for the line above which is a generic line
CGRect pageRect = CGPDFPageGetBoxRect(myPageRef, kCGPDFMediaBox);
//CGFloat pdfScale = width/pageRect.size.width;
//pageRect.size = CGSizeMake(pageRect.size.width*pdfScale, pageRect.size.height*pdfScale);
pageRect.origin = CGPointZero;
UIGraphicsBeginImageContext(pageRect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
// White BG
CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
CGContextFillRect(context,pageRect);
CGContextSaveGState(context);
// Next 3 lines makes the rotations so that the page look in the right direction
CGContextTranslateCTM(context, 0.0, pageRect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(myPageRef, kCGPDFMediaBox, pageRect, 0, true));
CGContextDrawPDFPage(context, myPageRef);
CGContextRestoreGState(context);
UIImage *thm = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return thm;
}
РЕДАКТИРОВАТЬ: См. Печать-uiimage-using-airprint-причины-cut-off-content