如何在不使用临时文件的情况下在 UIWebview 中打开密码保护 PDF/DOC?
How to open Password Protected PDF/DOC in UIWebview without using a temp file?
我们正在尝试在 UIWebview 中打开受密码保护的 PDF/DOC 文件。出于安全考虑,我们只能从服务器检索文件并存储到内存中(即NSData),而不能存储为文件。
我们尝试在 UIWebiew 中使用 loaddata 函数,它只能在没有密码保护的情况下成功加载 doc/xls/ppt/pdf。
对于doc/xls个有密码的文件,显示"Unable to Read Document. The operation couldn't be completed (QuickLookErrorDomain error 44820/912"。请问如何在UIWebview中打开文件?
对于带密码的pdf文件,它显示"The document "空白“受密码保护”。请问如何才能显示正确的文件名而不是"Blank"?
我也搜索了cgpdf,知道如何将pdf文件解锁为CGPDFDocumentRef,但找不到将其改回NSData并直接输入到UIWebview的方法。
谢谢。
在本地写入文件并读取数据并在网络视图中显示
//convert file data(ie : NSData) as string
NSData *fileData;//This is the data from your request
NSString *fileString = [[NSString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];
//get the file path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"sample.pdf"];
//Save as file
NSError *error;
BOOL hasFileWritten = [fileString writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if(!hasFileWritten)
{
NSLog(@"Write file error: %@", error);
}
//open pdf in webview
NSURL *targetURL = [NSURL fileURLWithPath:filePath];
NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
[webView loadRequest:request];
更新
不在本地写入文件数据,在内存中处理数据并在webview中显示pdf文件
@interface ViewController ()
{
IBOutlet UIWebView *webView;
CATiledLayer *tiledLayer;
CGPDFPageRef pageRef;
}
@end
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)url);
BOOL success = CGPDFDocumentUnlockWithPassword(pdf, "test");
if(success)
{
pageRef = CGPDFDocumentGetPage(pdf, 1);
CGRect pageRect = self.view.frame;
tiledLayer = [CATiledLayer layer];
tiledLayer.delegate = self;
tiledLayer.tileSize = CGSizeMake(1024.0, 1024.0);
tiledLayer.levelsOfDetail = 1000;
tiledLayer.levelsOfDetailBias = 1000;
tiledLayer.frame = pageRect;
UIView *contentView = [[UIView alloc] initWithFrame:pageRect];
[contentView.layer addSublayer:tiledLayer];
[webView addSubview:contentView];
}
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx));
CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(pageRef, kCGPDFCropBox, layer.bounds, 0, true));
CGContextDrawPDFPage(ctx, pageRef);
}
要解锁受保护的 PDF 文件,您必须使用 CGPDFDocument
然后使用CGPDFDocumentUnlockWithPassword你可以解锁你的文件,UIWebView更简单,但你的情况需要CGPDFDocument
这里有一个library可能对你有用
我们正在尝试在 UIWebview 中打开受密码保护的 PDF/DOC 文件。出于安全考虑,我们只能从服务器检索文件并存储到内存中(即NSData),而不能存储为文件。
我们尝试在 UIWebiew 中使用 loaddata 函数,它只能在没有密码保护的情况下成功加载 doc/xls/ppt/pdf。
对于doc/xls个有密码的文件,显示"Unable to Read Document. The operation couldn't be completed (QuickLookErrorDomain error 44820/912"。请问如何在UIWebview中打开文件?
对于带密码的pdf文件,它显示"The document "空白“受密码保护”。请问如何才能显示正确的文件名而不是"Blank"?
我也搜索了cgpdf,知道如何将pdf文件解锁为CGPDFDocumentRef,但找不到将其改回NSData并直接输入到UIWebview的方法。
谢谢。
在本地写入文件并读取数据并在网络视图中显示
//convert file data(ie : NSData) as string
NSData *fileData;//This is the data from your request
NSString *fileString = [[NSString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];
//get the file path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"sample.pdf"];
//Save as file
NSError *error;
BOOL hasFileWritten = [fileString writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if(!hasFileWritten)
{
NSLog(@"Write file error: %@", error);
}
//open pdf in webview
NSURL *targetURL = [NSURL fileURLWithPath:filePath];
NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
[webView loadRequest:request];
更新 不在本地写入文件数据,在内存中处理数据并在webview中显示pdf文件
@interface ViewController ()
{
IBOutlet UIWebView *webView;
CATiledLayer *tiledLayer;
CGPDFPageRef pageRef;
}
@end
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)url);
BOOL success = CGPDFDocumentUnlockWithPassword(pdf, "test");
if(success)
{
pageRef = CGPDFDocumentGetPage(pdf, 1);
CGRect pageRect = self.view.frame;
tiledLayer = [CATiledLayer layer];
tiledLayer.delegate = self;
tiledLayer.tileSize = CGSizeMake(1024.0, 1024.0);
tiledLayer.levelsOfDetail = 1000;
tiledLayer.levelsOfDetailBias = 1000;
tiledLayer.frame = pageRect;
UIView *contentView = [[UIView alloc] initWithFrame:pageRect];
[contentView.layer addSublayer:tiledLayer];
[webView addSubview:contentView];
}
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx));
CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(pageRef, kCGPDFCropBox, layer.bounds, 0, true));
CGContextDrawPDFPage(ctx, pageRef);
}
要解锁受保护的 PDF 文件,您必须使用 CGPDFDocument
然后使用CGPDFDocumentUnlockWithPassword你可以解锁你的文件,UIWebView更简单,但你的情况需要CGPDFDocument
这里有一个library可能对你有用