Не удалось найти PDF-заголовок: `% PDF 'не найден

Я получаю этот журнал, когда пытаюсь загрузить 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.

Спасибо за вашу помощь.

Ответ 1

Обновление на SEP 9 2014: iOS8 GM исправил эту проблему для приложений, с которыми я работаю.

Ответ до SEP 9 2014 Сообщается, что это известная ошибка Apple в выпусках iOS8 Beta 5. https://developer.apple.com/library/prerelease/ios/releasenotes/General/RN-iOSSDK-8.0/ https://devforums.apple.com/message/1017919#1017919

Мы должны подождать следующей версии и посмотреть, исправлена ​​ли она.

Ответ 2

Я согласен с тем, что в iOS 8 beta 5 есть ошибка (или изменение поведения), что означает, что ваш код больше не работает (и он был прав. У меня есть то же самое, и он работал отлично до iOS 8 бета 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];

Теперь этот бит кода не должен использоваться "как есть", поскольку он является синхронным.

Я чувствую, что ответ Nithin действителен, но он не отвечает на проблему, определенную с помощью iOS 8 beta 5. Основной код тот же и попадет в ту же ошибку iOS.

Ответ 3

Это сработало для меня 👊👍

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

Ответ 4

У меня была та же проблема в iOS 8 beta 5. Код типа fooobar.com/questions/450650/... работает, но я бы рекомендовал добавить последний параметр 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];

Ответ 5

Я много лет избивал себя по этой конкретной проблеме и, наконец, нашел ответ сегодня. Я всегда обнаружил, что некоторые PDF файлы отлично открываются в iOS (либо с кодом, похожим на ваш, который пытается загрузить его в UIWebview, либо с помощью метода canOpenUrl: UIApplications), но другие вообще не могут быть открыты.

В принципе, для PDF должен быть установлен заголовок/нижний колонтитул для того, чтобы быть открытым iOS (на самом деле это просто Safari, у которого есть эта проблема, поскольку Quicklook и Acrobat Reader могут без проблем обрабатывать PDF файлы без заголовков без проблем).

Ответ 6

У меня такая же проблема, как создание приложения из 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;
}

Ответ 7

Я столкнулся с этим сообщением об ошибке при отправке документа PDF, который я сгенерировал для принтера (по крайней мере, в симуляторе). Поделитесь ею, добавив заголовок в документ PDF, предоставив CFDictionary вместо nil в качестве последнего параметра для построения контекста 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
        }
    }