2011-10-04 14 views
7

Nie chcę, aby utworzyć nowy plik PDF, że już wykonane, ale chcemy pokazać i edytować istniejący plik pdf w iOS za pośrednictwem kodu ..Jak wyświetlić i edytować istniejące pliki PDF w aplikacji ios

Czy to możliwe czy nie, a jeśli to możliwe, niż jak mogę to zrobić ...

Aktualizacja

Załóżmy, że będzie tekst dokument pdf i chcemy wprowadzić inny tekst w tym pliku i zapisać it..so jak to zrobić, programując?

Proszę mi pomóc rozwiązać ten problem ...

góry dziękuję ...

+0

zaktualizowałem moją odpowiedź – Geoffroy

Odpowiedz

0

Można użyć Quartz2D manipulować plik PDF, otworzyć je, dokonaj transformacji i tak dalej.

Zapoznaj się z oficjalnym documentation

Aktualizacja:

Stwórz swój kontekst pdf jak wyjaśniono w dokumentacji, a potem po prostu trzeba napisać tekst:

http://developer.apple.com/library/ios/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_text/dq_text.html#//apple_ref/doc/uid/TP30001066-CH213-TPXREF101

+1

Czytałem dokumentację, ale nie wiem od czego zacząć .. –

+1

proszę zobaczyć moje zaktualizowaną pytanie –

+1

nie wiem, kto uważał, że twoje komentarze są "świetne komentarze", ale poważnie, sprawdź inne pytania związane z PDFem (w StackOverflow jest ich tak wiele) ... nie ma prostej odpowiedzi na twoje pytanie ... – lukya

1

znam jej zbyt spóźniony na to pytanie, jednak chciałbym dodać moje rozwiązanie.

Używam UIGraphicsBeginPDFContextToFile do generowania pliku PDF. I utworzeniu klasy o nazwie PDFCreator z klasy bazowej UIViewController, że mam dwie funkcje tak:

- (void) beginContextWithFile:(NSString *)filename 
{ 
    pageSize = CGSizeMake(1024, 1424); 

    UIGraphicsBeginPDFContextToFile(filename, CGRectZero, nil); 

    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil); 

    [self createInitialPart]; 
} 

- (void) endContext 
{ 
    UIGraphicsEndPDFContext(); 
} 

mojego autorstwa obiekt tej klasy w pliku app delegata, ponieważ będzie ona zachować obiekt do momentu zakończenia aplikacji (tak jak moje wymaganie).

Na początku dzwonię pod numer beginContextWithFile: i utworzę plik pdf w katalogu dokumentów wraz z danymi, które dodaję, poprzez wywołanie metody createInitialPart.

W pewnym momencie muszę zaktualizować ten plik, więc mam inną metodę o nazwie secondPart, mimo że nazwałem ją dla więcej danych do dołączenia do tego pliku.

Po wypełnieniu Stworzyłem, muszę zadzwonić pod numer endContext z klasy PDFCreator, który zakończy generowanie pdf i tak, będę mieć zaktualizowany plik.

Jest to trochę skomplikowane i nie wykonywać żadnych kontroli pamięci chociaż miałem wymóg, znalazłem rozwiązanie :)

+0

Zobacz na przykład wywołanie tej funkcji 'beginContextWithFile' sprawi, że plik PDF dla mnie, ale nie zapisze go, dopóki nie wezmę metody "endContext". Musiałbym wymagać, gdzie, nazwałem 'beginContextWithFile' w jednej klasie, a po niektórych aktualizacjach wywołuję metodę' endContext'. – Hemang

1

udało mi się to zrobić przez utworzenie kopii oryginalnego pliku PDF i modyfikacji podczas procesu budowania.

PS: W moim rozwiązaniu musiałem edytować informacje o dokumencie nowego pliku PDF, dlatego użyłem parametru tematu, aby to zrobić.

W Swift 3

func createPDF(on path: String?, from templateURL: URL?, with subject: String?) { 
    guard let newPDFPath = path, 
     let pdfURL = templateURL else { return } 

    let options = [(kCGPDFContextSubject as String): subject ?? ""] as CFDictionary 

    UIGraphicsBeginPDFContextToFile(newPDFPath, .zero, options as? [AnyHashable : Any]) 

    let templateDocument = CGPDFDocument(pdfURL as CFURL) 
    let pageCount = templateDocument?.numberOfPages ?? 0 

    for i in 1...pageCount { 

     //get bounds of template page 
     if let templatePage = templateDocument?.page(at: i) { 
      let templatePageBounds = templatePage.getBoxRect(.cropBox) 

      //create empty page with corresponding bounds in new document 
      UIGraphicsBeginPDFPageWithInfo(templatePageBounds, nil) 
      let context = UIGraphicsGetCurrentContext() 

      //flip context due to different origins 
      context?.translateBy(x: 0.0, y: templatePageBounds.height) 
      context?.scaleBy(x: 1.0, y: -1.0) 

      //copy content of template page on the corresponding page in new file 
      context?.drawPDFPage(templatePage) 

      //flip context back 
      context?.translateBy(x: 0.0, y: templatePageBounds.height) 
      context?.scaleBy(x: 1.0, y: -1.0) 


      // -->>>> Do your change here <<<<-- 
      /* Here you can do any drawings */ 

     } 
    } 
    UIGraphicsEndPDFContext() 
} 
+0

Powinno to oznaczać jako najlepszą odpowiedź. Po prostu uratuj mi życie. Czy mogę zadać ci pytanie: Używam widoku internetowego do wyświetlania pliku PDF, gdy użytkownik dotyka pozycji w tym pliku PDF, a następnie utwórz znak na tej pozycji. Wiem, że mogę użyć powyższej funkcji do utworzenia nowej bazy PDF na szablonie, po prostu zastanawiam się, jak mogę uzyskać pozycję – user3783161

+0

Dziękuję bardzo. Próbowałem odpowiedzieć na twoje pytanie [TUTAJ] (https://stackoverflow.com/a/45701477/6282606). – Enrique

Powiązane problemy