【问题标题】:UIPrintInteractionController in landscapeUIPrintInteractionController 在横向
【发布时间】:2012-04-08 22:05:40
【问题描述】:

我正在尝试打印从我的 iPad 应用程序中的网络服务器提取的 PDF 文档。 文档是横向的(通过预览证明),但 UiPrinterInteractionController 以纵向模式打印文档。

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

我尝试将文档打印到打印机模拟器。当我进入保存文档的文件夹时,我进入了文档。一份,原文件,一份打印出来的。

原始文件是横向的并且方向正确。但第二个,打印输出,是纵向的,边框被剪掉了。

有什么想法吗? 谢谢你的帮助,朱利安

【问题讨论】:

  • 我用另一台打印机测试了打印。当我使用其中一台 InkJet 打印机而不是 Laser 时,它就像魅力一样!不幸的是,我没有 AirPrinter,所以我无法进行真实测试。有人知道这个问题吗?

标签: ios ipad pdf printing landscape


【解决方案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;
}

【讨论】:

  • 这行不通。当然,这对某些人来说是一种解决方法!但我的问题是,一台打印机打印正确,另一台打印错误……我认为这是打印机问题,无法修复
  • 嗨,是的,我在模拟器中遇到了您的问题,InkJet 工作正常,激光工作不工作。实际上试图在现实世界的打印机上打印但没有运气,风景 pdf 仍然没有旋转以适合纸张。所以,我尽量不要在 printInfo.orientation 上进行中继,因为它不能正常工作,并且在打印之前旋转文档的内容并且效果很好。现在我所有的 pdf 文件都以正确的方向打印在纸上和激光模拟器上。但也许我错过了一些东西,这不是你需要的..
  • 不,这听起来正是我所需要的。因此,您将打印机方向设置为纵向(或保持原样),然后手动将页面内容旋转为横向?这听起来很简单……我只是看不到树木的树林……谢谢你的想法!
  • 还有一个问题:您的代码 (CGPDFPageRef page = CGPDFDocumentGetPage(document, 1)) 是否只处理一页?那么我必须使用 for(){} 循环吗?如果是这样,我如何将这些页面合并回一个文档?
  • 敬礼,您指出的代码仅用于获取 rect 以了解页面内容方向,当它的宽度 > 高度时,我们将进入 for 循环,您可以在其中绘制所有页面 page = CGPDFDocumentGetPage(document, i + 1);。关于方向选项,因此默认情况下未分配并保留为纵向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
相关资源
最近更新 更多