【问题标题】:How to draw PDF Context in Cocoa如何在 Cocoa 中绘制 PDF 上下文
【发布时间】:2013-01-28 19:45:51
【问题描述】:

我正在尝试使用 NSView 对象保存 PDF 文件。 这是Square 类(NSView 的子类)的实现。

@implementation Square

- (id)initWithColor:(NSColor *)aColor;
{
if (self = [super init])
{
    self.frame = NSMakeRect(0, 0, 50, 50);
    self.color = aColor;
}
return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
[self.color set];
NSRectFill(dirtyRect);

}

这是我的DrawView 的部分实现-NSView 的子类

- (void)awakeFromNib
{
squareGroup = [[NSMutableArray alloc] init];
}

- (void)addSquare:(Square *)square
{
[squareGroup addObject:square];
[self addSubview:square];
}

- (void)drawRect:(NSRect)dirtyRect
{
[[NSColor whiteColor] set];
NSRectFill(dirtyRect);
}

我可以点击按钮RedBlue 并添加蓝色或红色的Square 对象,当我点击Save 时,我想保存白色DrawViewSquare 对象。我现在可以在DrawView 上移动Square 对象,因此每个Square 对象都位于不同的位置。

我的保存方法如下所示(在DrawView 类中):

- (void)saveAsPDF
{
NSString *homeDirectory = NSHomeDirectory();
NSURL *fileURL = [NSURL fileURLWithPath:[homeDirectory stringByAppendingPathComponent:@"file.pdf"]];

CGRect mediaBox = self.bounds;
CGContextRef ctx = CGPDFContextCreateWithURL((__bridge CFURLRef)(fileURL), &mediaBox, NULL);

CGPDFContextBeginPage(ctx, NULL);

for (Square *square in squareGroup) {
    [square.layer renderInContext:ctx];
}

[self.layer renderInContext:ctx];

CGPDFContextEndPage(ctx);
CFRelease(ctx);
}

结果我的主目录中只有空白文件。

我的保存方法有什么问题?我怎样才能正确地做到这一点?

【问题讨论】:

    标签: macos pdf cocoa draw quartz-graphics


    【解决方案1】:

    有一个非常有用的教程here 可以帮助你

    他们提出了两种方法:第一种是这样,但第二种更全面,值得一看。

    (void)didEnd:(NSSavePanel *)sheet
    returnCode:(int)code
    saveFormat:(void *)saveType
    {
    if (code == NSOKButton)
    {
        if (pageIt)
        {
    
        }
        else
        {
            NSRect r = [textView bounds];
            NSData *data = [textView dataWithPDFInsideRect:r];
    
            [data writeToFile:[sheet filename] atomically:YES];
        }
    }
    }
    

    【讨论】:

    • 谢谢。您的示例粘贴在这里工作正确,但我也从超链接中阅读了这个。谢谢。
    • 乐于助人。发布代码以防万一链接断开总是一个好主意! :)
    • 这种方法可以制作多页吗?
    • 我不知道我没有测试过。我想你可以用第二种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多