UIPrintInteractionController在风景中

时间:2012-03-24 18:58:50

标签: ios ipad pdf printing landscape

我正试图从我的iPad应用程序打印从Web服务器中提取的PDF文档。 该文档是横向的(使用预览证明),但UiPrinterInteractionController以纵向模式打印文档。

我设置了printInfo.orientation = UiPrintInfoOrientationLandscape;,但它似乎没有帮助。

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

原始文件处于横向和正确的方向。但是第二个是打印输出,是纵向的,边框是切割的。

有什么想法吗? 谢谢你的帮助,Julian

1 个答案:

答案 0 :(得分: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;
}