UIPrintInteractionController не печатает на полную страницу в iPhone
Я печатаю PDF-файл с iPhone на Airprint-совместимый принтер, используя пример печати документа Apple. Но я не получаю распечатку всей страницы с iPhone, пожалуйста, посмотрите изображение того, что я получаю, мне нужно, чтобы PDF был напечатан на полной длине бумаги, ширине.
Код, который я использую для функции печати, приведен ниже, это тот же код, что и в примере приложения Apple print,
UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];
if(!controller){
NSLog(@"Couldn't get shared UIPrintInteractionController!");
return;
}
UIPrintInteractionCompletionHandler completionHandler =
^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
if(!completed && error){
NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code);
}
};
controller.delegate = self;
// Obtain a printInfo so that we can set our printing defaults.
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
// This application produces General content that contains color.
printInfo.outputType = UIPrintInfoOutputGeneral;
// We'll use the URL as the job name.
printInfo.jobName = [_filePath lastPathComponent];
// Set duplex so that it is available if the printer supports it. We are
// performing portrait printing so we want to duplex along the long edge.
printInfo.duplex = UIPrintInfoDuplexLongEdge;
// Use this printInfo for this print job.
controller.printInfo = printInfo;
controller.printingItem = myData;
// Be sure the page range controls are present for documents of > 1 page.
controller.showsPageRange = YES;
// This code uses a custom UIPrintPageRenderer so that it can draw a header and footer.
APLPrintPageRenderer *myRenderer = [[APLPrintPageRenderer alloc] init];
// UIPrintPageRenderer *myRenderer = [[UIPrintPageRenderer alloc] init];
// The APLPrintPageRenderer class provides a jobtitle that it will label each page with.
// myRenderer.jobTitle = printInfo.jobName;
// To draw the content of each page, a UIViewPrintFormatter is used.
UIViewPrintFormatter *viewFormatter = [docWebView viewPrintFormatter];
#if SIMPLE_LAYOUT
UIFont *font = [UIFont fontWithName:@"Helvetica" size:HEADER_FOOTER_TEXT_HEIGHT];
CGSize titleSize = [myRenderer.jobTitle sizeWithFont:font];
myRenderer.headerHeight = myRenderer.footerHeight = titleSize.height + HEADER_FOOTER_MARGIN_PADDING;
#endif
[myRenderer addPrintFormatter:viewFormatter startingAtPageAtIndex:0];
// Set our custom renderer as the printPageRenderer for the print job.
controller.printPageRenderer = myRenderer;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
[controller presentFromBarButtonItem:sender animated:YES completionHandler:completionHandler]; // iPad
}
else
{
docWebView.hidden = YES;
[controller presentAnimated:YES completionHandler:completionHandler]; // iPhone
}
3 ответа
Я генерирую PDF-файлы, чтобы распечатать всю страницу, рисуя в PDF-тексте. Я установил это с вызовом как это:
NSMutableData *pdfData = [NSMutableData data];
UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil);
обратите внимание, что, поскольку я передал в CGRectZero для размера, контекст приходит в его размер по умолчанию
/*
default pdf..
8.5 X 11 inch
612 x 792
*/
** это только 72 точек на дюйм, но это по умолчанию. У меня есть хитрость, когда я уменьшаю масштаб перед рисованием, чтобы улучшить разрешение:
for (int page = 0 : page < numberPages : page ++ ){
UIGraphicsBeginPDFPage();
CGContextRef pdfContext = UIGraphicsGetCurrentContext();
CGFloat scaleFactor = 3.0;
CGContextSaveGState(pdfContext);
CGContextScaleCTM(pdfContext, 1.0/scaleFactor, 1.0/scaleFactor);
///draw stuff
/// context size is now (612.0 * 3.0 , 792.0 * 3.0) , i.e. resolution 72.0 * 3.0 dpi..
//
CGContextRestoreGState(pdfContext);
}//page drawing loop
NSString *filePath = [[NSFileManager defaultManager] //etcetc make a path];
BOOL success = [pdfData writeToFile:filePath atomically:YES];
Хорошо, теперь у меня есть мой PDF, который я печатаю прямо в UIPrintInteractionController
NSData *pdfData = [NSData dataWithContentsOfFile:[[self pdfView]filePath]];
if ([UIPrintInteractionController canPrintData:pdfData]) {
UIPrintInteractionController *pr = [UIPrintInteractionController sharedPrintController];
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
^(UIPrintInteractionController *pic, BOOL completed, NSError *error) {
if (!completed && error) NSLog(@"Print error: %@", error);
};
pr.printingItem = pdfData;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[pr presentFromRect:tool.frame inView:self.view animated:YES completionHandler:completionHandler];
} else {
[pr presentAnimated:YES completionHandler:completionHandler];
}
}
Обратите внимание, что я не связываюсь с UIPrintPageRenderer. У меня нет опыта с этим классом, мне никогда не нужно было его изучать. Но мне кажется, что если в нем есть место для верхнего и нижнего колонтитула, то они обязательно уменьшат размер вашего документа, чтобы освободить место. Попробуйте включить свой верхний и нижний колонтитулы в сам документ. Удачи
bestPaperForPageSize:withPapersFromArray:
Возвращает объект бумаги для печати, который, по мнению UIKit, является наилучшим для задания на печать на основе заданного размера страницы и комбинаций размера бумаги и области изображения, специфичных для принтера.
+ (UIPrintPaper *)bestPaperForPageSize:(CGSize)pageSize withPapersFromArray:(NSArray *)paperList
Делегат UIPrintInteractionController
может вызвать этот метод в своей реализации printInteractionController: choosePaper: метод объявлен в UIPrintInteractionControllerDelegate
протокол.
Вместо UIViewPrintFormatter *viewFormatter = [docWebView viewPrintFormatter]; use viewPrintFormatter *viewFormatter = [[UIPrintFormatter alloc] init];
не нужен специальный форматер для PDF и изображения