2012-03-24 63 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