这是一个令人沮丧的问题。
我正在使用UIPrintInteractionController
打印PDF文件。这个PDF文件的大小是 A4,595x842 ,但是印刷的内容缩小了。
根据我是否使用iPhone模拟器,结果甚至不同。当我在iPhone模拟器中测试以下代码时,我打印的文件是实际大小。但是当我在设备(iPad)中测试这些代码时,问题就出现了,并附带日志“ Deskjet \ 0323520 \ 032series \ 032 [5B73DB] ._ ipp._tcp.local。:Print-Job请求成功并出现警告:作业属性与打印文档不匹配。“
我写的代码是这样的:
- (IBAction)printButtonTouched:(UIButton *)sender {
NSURL *testFileURL = [self makeTestPDF];
if ([UIPrintInteractionController canPrintURL:testFileURL]) {
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.jobName = testFileURL.path;
printInfo.orientation = UIPrintInfoOrientationPortrait;
printInfo.outputType = UIPrintInfoOutputGeneral;
printInfo.duplex = UIPrintInfoDuplexNone;
self.myPrinter.printInfo =printInfo;
self.myPrinter.printingItem = testFileURL;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[self.myPrinter presentFromRect:sender.frame inView:self.view animated:YES completionHandler:^(UIPrintInteractionController *printInteractionController, BOOL completed, NSError *error) {
}];
} else {
[self.myPrinter presentAnimated:YES completionHandler:^(UIPrintInteractionController *printInteractionController, BOOL completed, NSError *error) {
}];
}
}
}
- (UIPrintPaper *)printInteractionController:(UIPrintInteractionController *)printInteractionController choosePaper:(NSArray *)paperList
{
CGRect mediaBox = CGRectMake(0, 0, 595.276, 841.89);
UIPrintPaper *bestPaper = [UIPrintPaper bestPaperForPageSize:mediaBox.size withPapersFromArray:paperList];
return bestPaper;
}
当我在PDF上下文中开始PDF页面时,我的代码是这样的:
CGFloat a4Width = 595.276f;
CGFloat a4Height = 841.89f;
CGRect mediaBox = CGRectMake(0, 0, a4Width, a4Height);
UIGraphicsBeginPDFContextToFile(testPDFURL.path, mediaBox, nil);
UIGraphicsBeginPDFPageWithInfo(mediaBox, nil);
我正在测试的打印机 HP Deskjet Ink Advantage 3525 当我在另一台也支持 AirPrint 的打印机上进行测试时,同样的事情仍然发生,唯一的区别是缩小比例。
我正在寻找如何使用实际尺寸打印PDF的答案。我已经尝试了近一个星期才找到答案,但我没有找到有用的信息。请帮帮我。
答案 0 :(得分:0)
我正在做类似的事情,但就我而言,我打印UIImage
。我实现了UIPrintPageRender
子类,并且重写了drawContentForPage
方法。该方法将CGRect
暴露在应该打印内容的位置:
class ExtendedPageRenderer: UIPrintPageRenderer {
override func drawContentForPage(at pageIndex: Int, in contentRect: CGRect) {
// code that will draw/render in CGRect
}
}
我使用这样的类:
let pageRenderer = ExtendedPageRenderer()
let printController = UIPrintInteractionController.shared
printController.printPageRenderer = pageRenderer