gpt4 book ai didi

ios - Objective-C 为 PDF 创建映射文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:30:11 25 4
gpt4 key购买 nike

我正在创建一个这样的文件:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,PDFFile];

if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
[[NSFileManager defaultManager] createFileAtPath:filePath contents:dataBytes attributes:nil];
}

_previewItemURL = [NSURL fileURLWithPath:filePath];

我在 UIDocumentInteractionController 中显示它,如下所示:

if (_previewItemURL) {

UIDocumentInteractionController *documentInteractionController =[UIDocumentInteractionController interactionControllerWithURL:_previewItemURL];
documentInteractionController.delegate = self;

[documentInteractionController presentPreviewAnimated:YES];
}

但是,有时我保存的 PDF 文件太大,有时有 5.5MB,这导致 UIDocumentInteractionController 需要一些时间来加载 PDF。我在这里读书 https://stackoverflow.com/a/27863508/979331建议创建一个“映射”文件。我的问题是我不明白如何创建一个。这两天我一直在谷歌上疯狂搜索,但我就是不明白。

我认为问题出在 PDF 上,因为我试过这个:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pgnPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.pdf", @"example"]];

//filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,PDFFile];

//if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {

NSString *newFile = [[NSBundle mainBundle] pathForResource:@"example" ofType:@"pdf"];

[[NSFileManager defaultManager] copyItemAtPath:newFile toPath:pgnPath error:&error];

//[[NSFileManager defaultManager] createFileAtPath:filePath contents:dataBytes attributes:nil];
//}

//_previewItemURL = [[NSBundle mainBundle] URLForResource:@"example" withExtension:@"pdf"];

_previewItemURL = [NSURL fileURLWithPath:pgnPath];

对于 5.5MB 的 PDF,一切似乎都很好,问题可能出在我如何获取 PDF 上吗?我正在从 Web 服务获取字节,这是我的调用:

task = [dataSource.areaData GetPDFFileTestTwo:[NSString stringWithFormat:@"%@",encodedUrlStr] completion:^(NSData *data, NSURLResponse *response, NSError *error) {

NSError *myError;
NSArray *tableArray = [[NSArray alloc]initWithArray:[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&myError]];

NSData *dataBytes;

for (NSDictionary *dict in tableArray) {
NSString *base64 = dict[@"data"];
dataBytes = [[NSData alloc] initWithBase64EncodedString:base64 options:0];
}

if (dataBytes) {

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,PDFFile];

if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
[[NSFileManager defaultManager] createFileAtPath:filePath contents:dataBytes attributes:nil];
}

_previewItemURL = [NSURL fileURLWithPath:filePath];

if (_previewItemURL) {

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

UIDocumentInteractionController *documentInteractionController =[UIDocumentInteractionController interactionControllerWithURL:_previewItemURL];

documentInteractionController.delegate = self;

dispatch_async(dispatch_get_main_queue(), ^{

[documentInteractionController presentPreviewAnimated:YES];

});


});
}


}

}];

这里是 GetPDFFileTestTwo

-(NSURLSessionDataTask *)GetPDFFileTestTwo:(NSString *)PDFFile completion:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler{

NSString *FileBrowserRequestString = [NSString stringWithFormat:@"%@?PDFFile=%@",kIP,PDFFile];
NSURL *JSONURL = [NSURL URLWithString:FileBrowserRequestString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:JSONURL];
NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){

if(completionHandler)
{
completionHandler(data, response, error);
}

}];

[dataTask resume];

return dataTask;

}

kIP 是一个字符串,即网络服务 URL

最佳答案

您不是在“创建”映射文件。您正在将其读入映射到文件中字节的 NSData。这意味着,内存中的 NSData 字节在下面映射到文件中的字节。

这是一种读取映射文件的方法:

https://github.com/atomicbird/atomictools/blob/master/NSData%2BreallyMapped.h

如果您不能将 NSData 传递给 Controller ​​进行预览,映射就没有意义。即使可以,您也必须确保 Controller 不会在使用前复制您的数据。

考虑使用 PDFKit 框架,您可以在其中使用 NSData 初始化 PDFDocument 并将其显示在 PDFView 中。

关于ios - Objective-C 为 PDF 创建映射文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49055971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com