Мы пытаемся открыть защищенный паролем файл PDF / DOC в UIWebview. Из соображений безопасности мы можем только получить файлы с сервера и сохранить в памяти (например, NSData), но не можем сохранить как файл.

Мы пытались использовать функцию loaddata в UIWebiew, и она может успешно загрузить только doc / xls / ppt / pdf без защиты паролем.

Для файлов doc / xls с паролем отображается сообщение «Невозможно прочитать документ. Операция не может быть завершена (ошибка QuickLookErrorDomain 44820/912». Могу я спросить, как мы можем открыть файл в UIWebview?

Для PDF-файла с паролем отображается «Пустой документ защищен паролем». Могу я спросить, как мы можем показать правильное имя документа вместо «Пусто»?

Я также искал cgpdf и знаю, как разблокировать файл pdf как CGPDFDocumentRef, но не могу найти способ изменить его обратно на NSData и напрямую ввести в UIWebview.

Спасибо.

1
Forrest 18 Апр 2016 в 10:33

2 ответа

Лучший ответ

Записать файл локально, прочитать данные и показать их в веб-представлении

//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];

Обновить без записи данных файла в локальный, обработать данные в памяти и показать файл 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);
}
1
Jeyamahesan 18 Апр 2016 в 12:06

Чтобы разблокировать защищенный файл PDF, вы должны использовать CGPDFDocument

Затем с помощью CGPDFDocumentUp> CGPDFDocumentU > вы можете разблокировать свой файл, UIWebView намного проще, но в вашем случае требуется CGPDFDocument

Вот библиотека, которая может быть вам полезна

0
Mortgy 18 Апр 2016 в 09:14