【问题标题】:How to generate grid in PDF using Cocoa?如何使用 Cocoa 在 PDF 中生成网格?
【发布时间】:2011-04-22 20:58:29
【问题描述】:

我是 Cocoa 和 Objective-C 的初学者。

我想制作一个 Cocoa 应用程序,它将生成一个网格(用于练习中国书法)以导出为 PDF,类似于这个在线生成器:http://incompetech.com/graphpaper/chinesequarter/

我应该如何生成网格?我尝试将 Quartz 与 CustomView 一起使用,但没有成功。另外,一旦在 CustomView 中绘制了网格,将其“打印”到 PDF 的方法是什么?

感谢您的帮助。

【问题讨论】:

  • 哦,对不起;我忘了说我说的是 Cocoa 桌面应用程序,而不是 Cocoa touch。
  • cocoa 标签适用于 Mac OS X 上的 Cocoa,因此无论如何它都是隐含的。

标签: objective-c cocoa pdf grid quartz-graphics


【解决方案1】:

我应该如何生成网格?

实现一个custom view 来绘制它。

我尝试将 Quartz 与 CustomView 一起使用,...

这是一种方式; AppKit drawing 是另一个。不过,它们中的大多数部分都非常相似。 AppKit 直接基于 PostScript,而 Quartz 间接基于 PostScript。

……但没能走得很远。

您应该针对您的问题提出更具体的问题。

另外,一旦在 CustomView 中绘制了网格,将其“打印”到 PDF 的方法是什么?

发送a dataWithPDFInsideRect: message,传递bounds

请注意,没有“一旦在 CustomView 中绘制网格”。尽管可能存在一些内部缓存,但从概念上讲,视图不会绘制一次并保留它;它会在需要时,每次需要时,将其绘制到需要的地方。当窗口需要重新绘制时,Cocoa 会告诉脏区中的所有视图(重新)绘制,它们最终会绘制到屏幕上。当您请求 PDF 数据时,它也会告诉视图进行绘制,并且它将绘制到记录 PDF 数据的上下文中。这使得视图既可以是惰性的(仅在需要时绘制),也可以在不同的上下文中以不同的方式绘制(例如,在打印时)。

【讨论】:

    【解决方案2】:

    糟糕,您问的是 Cocoa,这是 Cocoa Touch,但我将把它留在这里,因为它可能有一些用处(至少对于以后发现它的其他人来说)。

    您可以在视图中绘制内容,然后将那里的内容放入 pdf 中。

    此代码将获取在 UIView(此处称为 sheetView)中绘制的内容,将其放入 pdf 中,然后将其作为附件放入电子邮件中(以便您现在可以查看)。您需要在标头中引用协议 MFMailComposeViewControllerDelegate。

    if ([MFMailComposeViewController canSendMail]) {
        //set up PDF rendering context
        NSMutableData *pdfData = [NSMutableData data];
        UIGraphicsBeginPDFContextToData(pdfData, sheetView.bounds, nil);
        UIGraphicsBeginPDFPage();
    
        //tell our view to draw (would normally use setNeedsDisplay, but need drawn now).
        [sheetView drawRect:sheetView.bounds];
    
        //remove PDF rendering context
        UIGraphicsEndPDFContext();
    
        //send PDF data in mail message as an attachment
        MFMailComposeViewController *mailComposer = [[[MFMailComposeViewController alloc] init] autorelease];
        mailComposer.mailComposeDelegate = self;If
        [mailComposer addAttachmentData:pdfData mimeType:@"application/pdf" fileName:@"SheetView.pdf"];
        [self presentModalViewController:mailComposer animated:YES];
    }
    else {
        if (WARNINGS) NSLog(@"Device is unable to send email in its current state.");
    }
    

    你还需要这个方法...

    #pragma mark -
    #pragma mark MFMailComposeViewControllerDelegate protocol method
    //also need to implement the following method, so that the email composer can let
    //us know that the user has clicked either Send or Cancel in the window.
    //It's our duty to end the modal session here.
    -(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
        [self dismissModalViewControllerAnimated:YES];
    }
    

    【讨论】:

    • 请注意,这是一个cocoa 问题,您的答案仅适用于cocoa-touch
    • 感谢您的代码。我将如何更改它以在非 Cocoa-touch 程序中运行?
    • 对不起,我不是 Mac 程序员,但希望很快就会有一个... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多