找不到PDF标题:'%PDF'未找到

时间:2014-08-06 10:54:29

标签: ios objective-c xcode pdf xcode6

当我尝试加载pdf并且不知道原因时,我得到了这个日志。

failed to find PDF header: `%PDF' not found.

她的代码:

- (void)viewDidLoad
{


    [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://webdesign-schoenefeld.de/es-app/heute.pdf"]]];
    NSLog(@"---------------pdfloading....,------------------------");
    [webview addSubview:activityind];
    timer = [NSTimer scheduledTimerWithTimeInterval:(1.0/2.0)
                                             target:self
                                           selector:@selector(loading)
                                           userInfo:nil
                                            repeats:YES];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

}

我使用的是Xcode 6 Beta 5和iOS 8 beta 5。

感谢您的帮助。

7 个答案:

答案 0 :(得分:9)

我同意,iOS 8 beta 5中似乎存在错误(或行为更改),这意味着您的代码不再有效(并且它是有效的。我有相同的功能,并且它在iOS 8中运行良好beta 4)。

我认为类型检测存在问题,因为如果我执行以下操作,它会起作用:

NSLog(@"About to request PDF document loading...");
NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:urlStr]];
[self.webView loadData:pdfData MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil];

现在不应该使用一些代码"按原样#34;因为它是同步的。

我觉得Nithin的回答是有效的,但它没有回答iOS 8 beta 5中特别看到的问题。主要代码是相同的,会遇到相同的iOS错误。

答案 1 :(得分:5)

这对我有用

NSURL *targetURL = [NSURL fileURLWithPath:pdfFilePath]; // <pdfFilePath> if full path of your pdf file
NSData *pdfData = [[NSData alloc] initWithContentsOfURL:targetURL];
[self.webview loadData:pdfData MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil];

答案 2 :(得分:4)

2014年9月9日更新:iOS8 GM解决了我与之合作的应用的问题。

2014年9月9日之前的回应 据报道,它是Apple在iOS8 Beta 5发行说明中的​​一个已知错误。 https://developer.apple.com/library/prerelease/ios/releasenotes/General/RN-iOSSDK-8.0/ https://devforums.apple.com/message/1017919#1017919

我们应该等待下一个版本,看看它是否已修复。

答案 3 :(得分:3)

我在iOS 8 beta 5中遇到了同样的问题。 像https://stackoverflow.com/a/25302602/2639006这样的代码有效,但我建议添加最后一个baseURL参数,因为内部pdf文档链接没有它就无法工作。

NSString *path = [[NSBundle mainBundle] pathForResource:@"pdf_NAME"ofType:@"pdf"];
NSURL *targetURL = [NSURL fileURLWithPath:path];
NSData *pdfData = [[NSData alloc] initWithContentsOfURL:targetURL];
[self.webView loadData:pdfData MIMEType:@"application/pdf" textEncodingName:@"UTF-8" baseURL:targetURL];

答案 4 :(得分:1)

我多年来一直在为这个特殊问题挣扎,终于在今天找到了答案。我总是发现一些PDF在iOS中打开很好(或者像你的代码那样尝试在UIWebview中加载它或者使用UIApplications的canOpenUrl:方法)但是其他的根本无法打开。

基本上,PDF需要设置页眉/页脚以便iOS可以打开(技术上它实际上只是Safari有这个问题,因为Quicklook和Acrobat Reader可以在没有问题的情况下处理devics上的无标题PDF )。

答案 5 :(得分:0)

我在iOS 8 SDK和Xcode 6上构建应用程序时遇到了同样的问题。我的问题是NSXMLParser在我选择的标签上调用了两次foundCharacters方法。我通过检查我的字符串数据是否为4的倍数来解决这个问题,这样我甚至可以尝试将其转换为基本的64位编码数据对象。一旦我发现该方法被调用了两次,我认为将这些字符串连接在一起会产生正确的数据:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    if([self.currentElement isEqualToString:kWarrantyPDFXMLTagDocumentData]) {

        if (self.combinedDocumentString == nil || self.combinedDocumentString.length == 0) {
            self.combinedDocumentString = string;
        }
        else {
            self.combinedDocumentString = [self.combinedDocumentString stringByAppendingString:string];
        }

        if (![self stringIsBase64:self.combinedDocumentString]) {
            return;
        }
        pdfData = [[NSData alloc] initWithData:[NSData base64DataFromString:self.combinedDocumentString]];

        // If you want to save your PDF, do so here.
        NSString *documentsDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"test.pdf"];
        [pdfData writeToFile:path atomically:YES];
    }
}



- (BOOL)stringIsBase64:(NSString *)str {
    if ([str length] % 4 == 0) {
        static NSCharacterSet *invertedBase64CharacterSet = nil;
        if (invertedBase64CharacterSet == nil) {
            invertedBase64CharacterSet = [[NSCharacterSet
                                        characterSetWithCharactersInString:
                                        @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="]
                                       invertedSet];
        }
        return [str rangeOfCharacterFromSet:invertedBase64CharacterSet
                                 options:NSLiteralSearch].location == NSNotFound;
    }
    return NO;
}

答案 6 :(得分:0)

我将生成的PDF文档发送到打印机时遇到此错误消息(至少在模拟器中)。通过提供CFDictionary而不是nil作为构建pdf上下文的最后一个参数,为PDF文档添加标题。这是Swift 3.0的帮助:

    let infoDict : CFDictionary = [kCGPDFContextTitle as String : "myTitleHere"] as CFDictionary  // Add title to PDF

    let pdfData = NSMutableData()
    if let dataConsumer : CGDataConsumer = CGDataConsumer(data: pdfData) {
        let myMediaBox = CGRect(x: 0, y: 0, width: page.pageWidth, height: page.pageHeight)
        if let pdfContext = CGContext(consumer: dataConsumer, mediaBox: &myMediaBox, infoDict) {
            // .... more pdf stuff
        }
    }