2012-03-24 28 views
1

我试图打印从我的iPad应用程序从Web服务器拉出的PDF文档。 该文档处于横向模式(通过预览版进行验证),但UiPrinterInteractionController以纵向模式打印文档。我设置了printInfo.orientation = UiPrintInfoOrientationLandscape;但它似乎没有帮助。横向UIPrintInteractionController

我尝试将文档打印到打印机模拟器。当我进入保存文档的文件夹时,我得到了文档。一个是原始文件,一个是打印文件。

原始文件处于横向并且方向正确。但是第二个是印刷输出,是纵向的,边界被切断。

任何想法? 感谢您的帮助,朱利安

+0

我用另一台打印机测试打印。当我使用_InkJet_打印机而不是_Laser_时,它就像魅力一样!不幸的是,我没有AirPrinter,所以我无法测试真实。有人知道这个问题吗? – 2012-03-24 19:07:03

回答

1

礼炮,

我想我们可以将其发送到打印机之前,手动旋转PDF数据。

下面是一些代码(对不起,实际上没有真正测试),我希望可以帮助(不知道这是一个最好的解决方案,但无论如何)。确保导入了“QuartzCore/QuartzCore.h”。

- (NSData *) prepareForPrinting:(NSData *) data 
{ 
    NSData *result = nil; 
    CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFDataRef)data); 
    CGPDFDocumentRef document = CGPDFDocumentCreateWithProvider(dataProvider); 
    CGPDFPageRef page = CGPDFDocumentGetPage(document, 1); 
    CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); 

    if (pageRect.size.width > pageRect.size.height) 
    { 
     GLuint w = pageRect.size.width; 
     GLuint h = pageRect.size.height; 
     pageRect.size.width = h; 
     pageRect.size.height = w; 
     CFMutableDataRef mutableData = CFDataCreateMutable(NULL, 0); 
     CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData(mutableData); 
     CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &pageRect, NULL); 
     int numPages = CGPDFDocumentGetNumberOfPages(document); 

     if (numPages > 0) 
     { 
      for (int i = 0; i < numPages; i++) 
      { 
       page = CGPDFDocumentGetPage(document, i + 1); 
       CGPDFContextBeginPage(pdfContext, NULL); 
       CGContextRotateCTM(pdfContext, M_PI_2); 
       CGContextTranslateCTM(pdfContext, 0, -pageRect.size.width); 
       CGContextDrawPDFPage(pdfContext, page); 
       CGPDFContextEndPage(pdfContext); 
      } 
     } 
     else 
     { 
      NSLog(@"Invalid PDF"); 
     } 
     CGContextRelease(pdfContext); 
     result = [NSData dataWithData:(NSData *)mutableData]; 
     CGDataConsumerRelease(dataConsumer); 
     CFRelease(mutableData); 
    } 
    else 
    { 
     result = data; 
    } 
    CGDataProviderRelease(dataProvider); 
    CGPDFDocumentRelease(document); 

    return result; 
} 
+0

这不起作用。对于一些人来说,这是一个解决方法,当然!但我的问题是,一台打印机以正确的方式打印,另一台打印错误...我认为这是一个打印机问题,无法修复 – 2012-06-27 18:54:59

+0

但是,谢谢你,男人! – 2012-06-27 18:55:23

+0

嗨,是的,我面对你的问题在模拟器与工作InkJet和不工作激光。实际上试图在真实世界的打印机上打印,没有运气,风景pdf仍然没有旋转以适应纸张。所以,我试图不在printInfo.orientation上进行中继,因为它在打印之前无法正常工作并旋转doc的内容,并且运行良好。现在我所有的pdf都以正确的方向打印在纸张和激光模拟器上。但是,也许我错过了一些东西,这不是你所需要的。 – themused 2012-06-28 09:02:37