iOS - 从HTML内容创建多页PDF

10

我有一个很长的html页面,想要将它转换为多页PDF文件。

我按照苹果官方文档这里的内容 - 如何创建多页PDF提供的说明进行操作。

但是,对NSString(带有类似数据的某些内容)的格式化比创建html页面困难。我已经创建了这个html页面,并在UIWebView中显示它。

现在我想将此HTML创建成一个多页PDF文件。

我正在使用的代码可以创建单页PDF。

- (void)createPDFfromUIView:(UIWebView *)aView saveToDocumentsWithFileName:(NSString*)aFilename
{
    // 创建一个可变的数据对象用于更新二进制数据,例如字节数组
    NSMutableData *pdfData = [NSMutableData data];
// 将pdf转换器指向可变数据对象和要转换的UIView UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil); UIGraphicsBeginPDFPage(); CGContextRef pdfContext = UIGraphicsGetCurrentContext();
// 绘制矩形到视图中,因此这被UIGraphicsBeginPDFContextToData捕获
[aView.layer renderInContext:pdfContext];
// 移除PDF渲染上下文 UIGraphicsEndPDFContext();
// 从iOS设备中检索文档目录 NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString* documentDirectory = [documentDirectories objectAtIndex:0]; NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];
// 通知可变数据对象将其内容写入磁盘上的文件中 [pdfData writeToFile:documentDirectoryFilename atomically:YES]; NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename); }

还有谁能给予帮助吗?

1个回答

16

我根据找到的所有好建议创建了一个类。我一直在不断地探索,希望我的类能为任何试图直接从某些HTML源创建多页PDF的人提供一个良好的起点。

您可以在此处找到完整的代码以及一些基本示例代码:https://github.com/iclems/iOS-htmltopdf

我和您面临的问题完全相同,我的要求是: - 完整的PDF(真正的文本,没有位图) - 智能分页(与每X像素切割整个高度的Web视图相比...)

因此,我使用的解决方案非常好,因为它利用了iOS用于拆分打印页面的相同工具。

让我解释一下,我设置了一个基于Web视图打印格式化程序的UIPrintPageRenderer(第一个提示):

UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init];

[render addPrintFormatter:webView.viewPrintFormatter startingAtPageAtIndex:0];

CGRect printableRect = CGRectMake(self.pageMargins.left,
                              self.pageMargins.top,
                              self.pageSize.width - self.pageMargins.left - self.pageMargins.right,
                              self.pageSize.height - self.pageMargins.top - self.pageMargins.bottom);

CGRect paperRect = CGRectMake(0, 0, self.pageSize.width, self.pageSize.height);

[render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"];
[render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"];

NSData *pdfData = [render printToPDF];

[pdfData writeToFile: self.PDFpath  atomically: YES];

与此同时,我已在UIPrintPageRenderer上创建了一个类别以支持:

-(NSData*) printToPDF
{
    [self doNotRasterizeSubviews:self.view];

    NSMutableData *pdfData = [NSMutableData data];

    UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil );

    [self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)];

    CGRect bounds = UIGraphicsGetPDFContextBounds();

    for ( int i = 0 ; i < self.numberOfPages ; i++ )
    {
        UIGraphicsBeginPDFPage();

        [self drawPageAtIndex: i inRect: bounds];
    }

    UIGraphicsEndPDFContext();

    return pdfData;
}

Wehrung,你真是太棒了。我刚刚看了一下示例应用程序,它完全符合我的要求。但是我的需求已经改变,我做了其他的事情。但这太棒了。我可能会在未来使用它。感谢你的努力和特别的解释。 - Viraj
这个框架的问题在于它无法捕获任何数据,例如文本框中的数据。它们都将是空白的。 - GuybrushThreepwood
运行得很好!!!太棒了!!! - Rudi
@cwehrung:我认为我们需要添加分页的功能? - Shailesh
嗨@cwehrung,这个解决方案适用于带有图像的HTML吗?谢谢~ - Jerome

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接