2

在我的 ios 应用程序中,我在滚动视图中列出了一些数据。单击按钮时,页面中的数据将以 pdf 文件格式生成。以下是一小段代码。

- (void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename{
    // Creates a mutable data object for updating with binary data, like a byte array
    NSMutableData *pdfData = [NSMutableData data];

    // Points the pdf converter to the mutable data object and to the UIView to be converted
    UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil);
    UIGraphicsBeginPDFPage();
    CGContextRef pdfContext = UIGraphicsGetCurrentContext();

    // draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData
    [aView.layer renderInContext:pdfContext];

    // remove PDF rendering context
    UIGraphicsEndPDFContext();

    // Retrieves the document directories from the iOS device
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

    NSString* documentDirectory = [documentDirectories objectAtIndex:0];
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];

    // instructs the mutable data object to write its context to a file on disk
    [pdfData writeToFile:documentDirectoryFilename atomically:YES];
    NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);
}

从上面的代码中,我能够生成一个 pdf 文件,但我面临以下问题。如果我有超过 50 个数据,在我的应用程序中,我只能看到前 10 个数据,并看到我需要滚动它们的其他数据。在这种情况下,当生成 pdf 文件时,它只获取前 10 个数据而不是其他数据。如何获取其他数据

4

4 回答 4

2

renderInContext:只会呈现您当前看到的内容 - UIScrollView 很智能,并且只会在层次结构中包含您现在需要的视图。您需要一个 for 循环来手动滚动和重绘。这可能很难正确处理,可能在滚动后手动调用 [aView layoutSubviews] 以强制 scrollView 立即重新排列子视图。

于 2013-01-12T10:35:27.420 回答
0

正如 steipete 所说,您可以使用循环来渲染上下文 - 您需要计算循环数 numOfLoop = webview.ScrollView.ContentSize.Height/weview.frame.size.height

  • 使用循环来渲染上下文 for(int i = 0; i < numOfLopp; i ++)

    1.UIGraphicsBeginPDFPage()

    1. 获取当前上下文
    2. 渲染上下文

这种方式在我的应用程序中运行正确,但是当 numOfLoop lager 时我遇到了大问题 - 你会变慢 renderInContext - 内存会增加 - >关闭应用程序这样,当我在一次时如何删除/释放上下文环形 ?

其他方式,您可以使用https://github.com/iclems/iOS-htmltopdf/blob/master/NDHTMLtoPDF.h 生成 PDF

于 2014-07-25T07:18:38.123 回答
0

@steipete,@all 嗨,我尝试了下面的代码,它生成了多页 PDF,但是所有页面都重复了视图中的可见区域。请添加任何进一步的想法以改善结果。

-(void)createPDFfromUIView:(UIWebView*)aView saveToDocumentsWithFileName:(NSString*)aFilename

{

NSString *oldFilePath= [[NSBundle mainBundle] pathForResource:@"ABC" ofType:@"pdf"];

NSMutableData *pdfData = [NSMutableData data];

UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil); 

CFURLRef url = CFURLCreateWithFileSystemPath (NULL, (CFStringRef)oldFilePath, kCFURLPOSIXPathStyle, 0); 

CGPDFDocumentRef templateDocument = CGPDFDocumentCreateWithURL(url); 

CFRelease(url); size_t count = CGPDFDocumentGetNumberOfPages(templateDocument); 

for (size_t pageNumber = 1; pageNumber <= count; pageNumber++) 

{ 

UIGraphicsBeginPDFPage(); 

CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 

[aView.layer renderInContext:pdfContext]; 

}

 CGPDFDocumentRelease(templateDocument); 

// remove PDF rendering context UIGraphicsEndPDFContext(); 

// Retrieves the document directories from the iOS device 
NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

NSString* documentDirectory = [documentDirectories objectAtIndex:0];

NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];

 [pdfData writeToFile:documentDirectoryFilename atomically:YES];

NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);

}
于 2014-09-19T04:23:12.690 回答
0

检查ScrollViewToPDF示例

它使用相同scrollview's layer renderInContext,但这里的 PDF 是根据您的要求创建的,例如一页 PDF 或多页 PDF

注意:它捕获 scrollView 的所有可见和不可见部分

于 2014-10-27T15:11:07.037 回答