Подтвердить что ты не робот

Как отобразить PDF на iOS

Я хочу знать, есть ли способ автономной сборки для xcode iOS, чтобы мы могли отображать файл pdf из локального файла.

Метод, который я сейчас использую, заключается в использовании UIWebView для отображения пользовательского HTML-кода, содержащего URL-адрес PDF (онлайн), но я хочу сделать автономную версию, если это возможно.

Но из онлайн-исследований, мне кажется, единственный способ отобразить PDF - это через UIWebView, если это действительно так, можно ли извлечь файл из локального ресурса (например, добавить файлы в мою папку ресурсов xcode) вместо использования PDF URL.

OFF-TOPIC: Что будет лучшим выбором? Вытащить локальный файл или использовать онлайн-URL для PDF файла?

Поскольку UIWebView требует подключения, было бы лучше выбрать просто подключить сетевой URL-адрес, поскольку он будет самым актуальным и обновленным.

Обратная связь высоко ценится.

РЕДАКТИРОВАТЬ: быстрый вопрос, если я использую метод UIDocumentInteractionController или фреймворк QuickLook, чтобы UIDocumentInteractionController его, это будет означать, что мне придется выпускать патч обновления каждый раз, когда добавляется новая статья в PDF (поправьте меня, если я ошибаюсь)

Принимая это во внимание, я тут же выдвинул контраргумент к своему собственному вопросу (извините, если кто-то из вас чувствует, что вы тратите время на меня>. <, Я человек, который любит задавать вопросы о возможностях и другой подход, который можно использовать для решения проблемы) В случае экономии времени от постоянного обновления и предоставления базового решения в режиме реального времени, которое заключается в использовании UIWebView (я знаю, что это противоречит моей цели этого SO потока), так как это proj основан на онлайн-сайте (откуда я получаю свой контент и источники), если бы я загружал их сайт для раздела статьи, было бы смело с моей стороны сказать, что, добавив переменную NSString, я могу добавить в NSRange используйте функцию viewDidLoad вместе с UIWebView, чтобы URL никогда не покидал раздел новостей и URL PDF. например, используя комбинацию if и функции NSRange, чтобы противостоять проверке того, что URL содержит только раздел новостей и PDF PDF)

Я однажды сделал функцию NSRange для точки на калькуляторе, так что я подумал, что сейчас самое время использовать ее для этого приложения.

PS - Это приложение является базовым проектом организации, и я стажер, который предоставляет им базовую структуру скелета.

4b9b3361

Ответ 1

Вы можете использовать UIWebView для непосредственного получения PDF файла из своего пакета, не нужно вызывать онлайн-сервис.

Локальный файл:

NSString *html = [NSString stringWithContentsOfFile:path1 encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:html baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]bundlePath]]];

Удаленный файл:

- (void) loadRemotePdf
    {
       CGRect rect = [[UIScreen mainScreen] bounds];
       CGSize screenSize = rect.size;
        
       UIWebView *myWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0,screenSize.width,screenSize.height)];
        webView.autoresizesSubviews = YES;
            webView.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);

       NSURL *myUrl = [NSURL URLWithString:@"http://www.mysite.com/test.pdf"];
       NSURLRequest *myRequest = [NSURLRequest requestWithURL:myUrl];
            
       [webView loadRequest:myRequest];

       [window addSubview: myWebView];
       [myWebView release];
            
}

Ответ 2

Много вариантов, вот 3:

1) Самый простой способ загрузить и отобразить локальный файл PDF - это использовать UIWebview следующим образом:

NSString *path = [[NSBundle mainBundle] pathForResource:@"document" ofType:@"pdf"];
NSURL *targetURL = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
[webView loadRequest:request];

2) Вы также можете использовать UIDocumentInteractionController/QLPreviewController для QLPreviewController отображения файлов PDF.

3) Другим способом было бы создать пользовательский PDF Viewer, как в примере с кодом яблок ZoomingPDFViewer. (используя UIPageViewController + CATiledLayer + UIScrollView)

Ответ 3

Советую вам использовать среду QuickLook при работе с файлами PDF.

Ответ 4

SWIFT 4.x

UIWebview подход в Swift:

    //let url = URL.init(string: "https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf")! // for file in web
    let url = Bundle.main.url(forResource: "filename", withExtension: ".pdf")! // for file in bundle
    let webView = UIWebView.init(frame: view.frame)
    webView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    webView.loadRequest(URLRequest.init(url: url))
    view.addSubview(webView)

Ответ 5

Внедрен новый инструментарий IO. Он имеет много специальных функций, связанных с отображением PDF файлов. В нем можно использовать класс PdfView для отображения PDF файла либо из локального файла, либо через URL-адрес.

PDFKit > PDFView

Ответ 7

NSString *path = [[NSBundle mainBundle] pathForResource:@"Yourpdf" ofType:@"pdf"];
NSURL *targetURL = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
UIWebView *webView=[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 300, 400)];
[[webView scrollView] setContentOffset:CGPointMake(0,500) animated:YES];
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"window.scrollTo(0.0, 50.0)"]];
[webView loadRequest:request];
[self.view addSubview:webView];

Ответ 8

Поздно, но с UIWebview есть некоторые ограничения на загрузку pdf файлов. Он не будет корректно загружать редактируемый pdf файл. поэтому загружайте любой тип PDF файлов, используйте следующий код

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"pdfFileName" ofType:@"pdf"]];
PDFView *view = [[PDFView alloc] initWithFrame:self.view.frame];
view.document = [[PDFDocument alloc] initWithURL:url];
[self.view addSubview:view];

Ответ 9

В моем случае у меня есть tableView, который переходит к PDFView на основе либо выбранной строки, либо индикатора детализации (есть два разных ViewController для каждого в разных частях моего приложения). У меня есть @IBOutlet для PDFView и использую этот код, чтобы открыть нужный PDF файл, который сохраняется в приложении:

@IBOutlet weak var myPDFView: PDFView!

var mySelection = String()

override func viewDidLoad() {
    super.viewDidLoad()

    if let path = Bundle.main.path(forResource: mySelection, ofType: "pdf") {
        let url = URL(fileURLWithPath: path)

        if let myDocument = PDFDocument(url: url) {
            myPDFView.document = myDocument
            myPDFView.autoScales = true
            myPDFView.displayMode = .singlePageContinuous
            myPDFView.displayDirection = .vertical
            myPDFView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        }
    }
}

Это все прекрасно работает. Правильные файлы PDF легко загружаются и заполняют экран так, как я хочу. Тем не менее, PDF всегда прокручивается немного, поэтому верхняя часть скрывается под панелью навигации. Обратите внимание на снимок экрана ниже, что верхняя часть документа не видна, но нижняя часть находится чуть выше панели вкладок внизу. Я думаю, что это связано с PDF-координатами, начинающимися в нижней части страницы, но я не могу понять, как заставить его загружать самый верх документа, поэтому фон в верхней части виден.

Simulator Screen Shot Link

Возможно, это связано с autoScales?

Ответ 10

Вы также можете использовать UIDocumentInteractionController!

let docController = UIDocumentInteractionController(url: URL(fileURLWithPath: path)) documentInteractionController.presentPreview(animated: true)

Ответ 11

мы iOS-программисты, а не JS/Web-программисты, так что оставайтесь в быстрой и API Apple. Более быстрый, чистый способ использования Quicklook.

Я цитирую Калимаркуса.

В любом случае код очень прост:

//  Copyright © 2019 ing.conti. All rights reserved.
//

import UIKit
import QuickLook


class ViewController: UIViewController, QLPreviewControllerDataSource {

    var previewController:QLPreviewController?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.previewController = QLPreviewController()
        previewController!.dataSource = self
        present(previewController!, animated: true)

    }

    //QL delegate:

    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return 1
    }


    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {

        guard let url = Bundle.main.url(forResource: "SAMPLE", withExtension: "pdf") else {
            fatalError("Could not load pdf")
        }

        return url as QLPreviewItem 
    }
}

Ответ 12

Инфраструктура PDFKit от Apple предоставляет широкий спектр кода, который помогает нам работать с PDF файлами, и одним из наиболее полезных является PDFView - он отображает PDF файлы на экране и позволяет пользователям взаимодействовать с ними.

Чтобы попробовать это, начните с импорта структуры PDFKit:

import PDFKit

Затем добавьте этот код в метод viewDidLoad(), чтобы создать PDFView и заполнить все доступное пространство:

let pdfView = PDFView()

pdfView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(pdfView)

pdfView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
pdfView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
pdfView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
pdfView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true

Наконец, создайте URL-адрес, указывающий на PDF файл, который есть у вас в пакете (или в каталоге документов), затем создайте из него объект PDFDocument и передайте его в представление PDF:

guard let path = Bundle.main.url(forResource: "example", withExtension: "pdf") else { return }

if let document = PDFDocument(url: path) {
    pdfView.document = document
}

Готово!