Cannot create PDF document with 400+ pages on iOS

前端 未结 4 1360
生来不讨喜
生来不讨喜 2020-12-06 05:37

I am using the following pseudocode to generate a PDF document:

CGContextRef context = CGPDFContextCreateWithURL(url, &rect, NULL);

for (int i = 1; i &l         


        
相关标签:
4条回答
  • 2020-12-06 05:39

    What about using a memory mapped file to back your CG data consumer? Then it doesn't necessarily have to fit in RAM all at once.

    I created an example here: https://gist.github.com/3748250

    Use it like this:

    NSURL * url = [ NSURL fileURLWithPath:@"pdf.pdf"] ;
    MemoryMappedDataConsumer * consumer = [ [ MemoryMappedDataConsumer alloc ] initWithURL:url ] ;
    
    CGDataConsumerRef cgDataConsumer = [ consumer CGDataConsumer ] ;
    
    CGContextRef c = CGPDFContextCreate( cgDataConsumer, NULL, NULL ) ;
    CGDataConsumerRelease( cgDataConsumer ) ;
    
    // write your PDF to context `c`
    
    CGPDFContextClose( c ) ;
    CGContextRelease( c ) ;
    
    return 0;
    
    0 讨论(0)
  • 2020-12-06 05:50

    Since you're creating a single document via CGPDFContextCreateWithURL the entire thing has to be held in memory and appended to, something that commonly (though I can't say for certain with iOS and CGPDFContextCreateWithURL) requires a full before and after copy of the document to be kept. No need for a leak to create a problem, even without the before-and-after issue.

    If you aren't trying to capture a bunch of existing UIKit-drawn stuff -- and in your sample it seems that you're not -- use the OS's printing methods instead, which offer built-in support for printing to a PDF. UIGraphicsBeginPDFContextToFile writes the pages out to disk as they're added so the whole thing doesn't have to be held in memory at once. You should be able to generate a huge PDF that way.

    0 讨论(0)
  • 2020-12-06 05:51

    Probably not the answer you want to hear, but looking at it from another perspective.

    Could you consider it as a limitation of the device?... First check the number of pages in the PDF and if it is too large, give a warning to the user. Therefore handling it gracefully.

    You could then expand on this....

    You could construct small PDF's on the iDevice and if the PDF is too large, construct it server-side the next time the iDevice has a net connection.

    0 讨论(0)
  • If you allocate too much memory, your app will crash. Why is generating an unusually large PDF a goal? What are you actually trying to accomplish?

    0 讨论(0)
提交回复
热议问题