On 11/06/2010, at 3:06 AM, Gideon King wrote:

> Hi, I have an offscreen view that I want to get the PDF data from. I use the 
> dataWithPDFInsideRect method, but I have found that this creates an 
> NSPrintOperation. This is a problem because I want to print using different 
> settings for this view only when a *real* print operation is happening. I 
> detect this in my drawing code like this:
> 
>       NSPrintOperation *printOperation = [NSPrintOperation currentOperation];
>       if (printOperation && ![[NSGraphicsContext currentContext] 
> isDrawingToScreen]) {
>               [self doSpecialStuffForPrinting];
>       }
> 
> Now the problem is that my special printing stuff is being called when I use 
> dataWithPDFInsideRect.
> 
> I see there is an -isCopyingOperation method which can tell me whether it is 
> sending to PDF at the time, but that is still not going to differentiate 
> between the print to PDF from the print panel, and the dataWithPDFInsideRect.
> 
> Is there any way of telling for sure whether it is a call to 
> dataWithPDFInsideRect that caused the drawing to happen? If not, I guess I'll 
> have to set up some sort of status variable, but I'd rather not if I don't 
> have to.


I don't know the direct answer to your question, but there are alternative ways 
to get PDF data out of a view, as a I put together some code to do almost 
exactly that last week.

Essentially you create a PDF graphics context and draw into that. 
-isDrawingToScreen should still return NO but AFAICT no print operation comes 
into play.

My code looks like this:

        NSSize size = [self bounds].size;
        NSRect destRect = NSZeroRect;
        destRect.size = size;
        
        NSMutableData* pdfData = [NSMutableData data];
        CGDataConsumerRef consumer = 
CGDataConsumerCreateWithCFData((CFMutableDataRef) pdfData );
        CGRect mediaBox = CGRectMake( 0, 0, size.width, size.height );
        CGContextRef pdfContext = CGPDFContextCreate( consumer, &mediaBox, NULL 
);
        CGDataConsumerRelease( consumer );
        
        NSAssert( pdfContext != NULL, @"could not create PDF context");
        
        NSGraphicsContext* newGC = [NSGraphicsContext 
graphicsContextWithGraphicsPort:pdfContext flipped:YES];
        [NSGraphicsContext saveGraphicsState];
        [NSGraphicsContext setCurrentContext:newGC];

        CGPDFContextBeginPage( pdfContext, NULL );
        
        // here you do your drawing. In my case I flip the context and call a 
method that draws an object into the current context.
        // for a general purpose method operating on a view I guess you could 
just call -drawRect: here having set a suitable CTM (or
        // perhaps lockFocus/unlockFocus will handle that).

        CGContextTranslateCTM( pdfContext, 0.0, size.height );
        CGContextScaleCTM( pdfContext, 1.0, -1.0 );
        
        [self drawContentInRect:destRect fromRect:NSZeroRect withStyle:nil];
        
        // end of drawing

        CGPDFContextEndPage( pdfContext );
        
        [NSGraphicsContext restoreGraphicsState];
        
        CGPDFContextClose( pdfContext );
        CGContextRelease( pdfContext );
        
        return pdfData;


--Graham



_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to