programing

빠르고 슬림한 iPhone/iPad/iOS용 PDF 뷰어 - 힌트?

newstyles 2023. 4. 14. 21:22

빠르고 슬림한 iPhone/iPad/iOS용 PDF 뷰어 - 힌트?

최근 PDF 도면에 대한 많은 질문이 있었습니다.

PDF를 수 .UIWebView그러나 이것은 좋은 PDF 뷰어에서 기대할 수 있는 성능과 기능을 제공할 수 없습니다.

PDF 페이지를 CALayer 또는 UELMage에 그릴 수 있습니다.애플은 확대 가능한 UIScrollview에서 큰 PDF를 그리는 방법을 보여주는 샘플 코드도 갖추고 있습니다.

하지만 같은 문제가 계속 발생하고 있습니다.

UIMage 방법:

  1. PDF 입니다.UIImage광학적으로 확장하거나 레이어 접근 방식을 사용하지 마십시오.
  2. 시 했습니다.UIImages PDFcontext제한/제한을 사용하여 새 확대/축소 렌더의 실시간 렌더를 만듭니다.

CATiled Layer 메서드:

  1. 페이지 데 상당한 가 소요됩니다.CALayer의 타일을 수 해도 표시 가능). 개개의 타일을 렌더링 할 수 있습니다(타일 사이즈를 조정해도 표시 가능).
  2. CALayers미리 준비할 수 없습니다(화면 외).

일반적으로 PDF 시청자들은 메모리도 상당히 많이 가지고 있다.Apple의 확대/축소 가능한 PDF 예제의 메모리 사용량도 감시할 수 있습니다.

PDF를 .UIImage다른 스레드(여기도 참조!)의 페이지를 표시해, 배율이 x1인 경우에 표시합니다. CATiledLayer스케일이 1을 넘으면 렌더링이 시작됩니다.iBooks 에서는, 페이지를 스크롤 하는 것과 같이, 페이지의 해상도가 낮은 버전을 1초 미만으로 표시할 수 있는 것과 같은 더블 테이크 어프로치를 취하고 있습니다.

PDF 이미지가 그리기 시작하기 전에 레이어를 마스킹할 준비가 되도록 페이지의 각 측면에 초점을 맞춰 2페이지를 렌더링합니다.포커스가 있는 페이지로부터 +2 페이지 떨어져 있는 경우, 페이지는 다시 파기됩니다.

Drawing PDF의 퍼포먼스/메모리 처리 능력 향상이나 여기서 논의된 기타 문제에 대해 통찰할 수 있는 사람이 있습니까?

편집: 힌트 (크레디트 - Luke Mcneice, VdesmedT, Matt Gallagher, Johann):

  • 가능한 한 미디어를 디스크에 저장합니다.

  • TiledLayer에서 렌더링하는 경우 더 큰 타일사이즈 사용

  • 플레이스 홀더 객체와 함께 자주 사용되는 어레이, 또는 다른 설계 접근 방식으로는 이 어레이를 들 수 있습니다.

  • 는, 「」보다 됩니다.CGPDFPageRef

  • NSOperations또는 GCD & Blocks를 사용하여 페이지를 미리 준비합니다.

  • CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault); 전에CGContextDrawPDFPage

  • NSOperations인 docRef로 .

  • 한 취소NSOperations할 수 있을 때는, 특히 메모리를 사용하고 있는 경우는, 콘텍스트를 열어 두는 것에 주의해 주세요.

  • 페이지 개체를 재사용하고 사용하지 않는 보기 삭제

  • 열려 있는 콘텍스트는 필요 없는 즉시 닫는다.

  • 메모리 경고를 수신하면 DocRef 및 모든 페이지 캐시 해제 및 새로고침

기타 PDF 기능:

문서

프로젝트 예시

  • Apple/Zooming PDF - 줌,UIScrollView,CATiledLayer
  • vfr/reader - 줌, 페이징,UIScrollView,CATiledView
  • 눈썹/잎 - 좋은 전환이 있는 페이지
  • / skim - 보이는 모든 것 (PDF Reader/Editor for OSX)

저는 다음과 같은 접근 방식을 사용하여 이러한 종류의 애플리케이션을 구축했습니다.

  • 생성된 이미지를 디스크에 캐시하여 항상 2~3개의 이미지를 별도의 스레드로 미리 생성합니다.
  • 저 with a with with with with with를 덧씌우지 .UIImage대신 확대/축소가 1일 때 레이어에 이미지를 그립니다.이러한 타일은 메모리 경고가 발생하면 자동으로 해제됩니다.

가 확대를 시작할 는 용축축/ the the the the the the the the 를 획득한다.CGPDFPageCTM을 사용하다★★★의 - (void)drawLayer: (CALayer*)layer inContext: (CGContextRef) context식이에요.

CGAffineTransform currentCTM = CGContextGetCTM(context);    
if (currentCTM.a == 1.0 && baseImage) {
    //Calculate ideal scale
    CGFloat scaleForWidth = baseImage.size.width/self.bounds.size.width;
    CGFloat scaleForHeight = baseImage.size.height/self.bounds.size.height; 
    CGFloat imageScaleFactor = MAX(scaleForWidth, scaleForHeight);

    CGSize imageSize = CGSizeMake(baseImage.size.width/imageScaleFactor, baseImage.size.height/imageScaleFactor);
    CGRect imageRect = CGRectMake((self.bounds.size.width-imageSize.width)/2, (self.bounds.size.height-imageSize.height)/2, imageSize.width, imageSize.height);
    CGContextDrawImage(context, imageRect, [baseImage CGImage]);
} else {
    @synchronized(issue) { 
        CGPDFPageRef pdfPage = CGPDFDocumentGetPage(issue.pdfDoc, pageIndex+1);
        pdfToPageTransform = CGPDFPageGetDrawingTransform(pdfPage, kCGPDFMediaBox, layer.bounds, 0, true);
        CGContextConcatCTM(context, pdfToPageTransform);    
        CGContextDrawPDFPage(context, pdfPage);
    }
}

는 이슈를 담고 입니다.CGPDFDocumentRefpdfDocmemoryWarnings를 때 작성하기 에 속성을 합니다....인 것 .CGPDFDocumentRef오브젝트는 삭제 방법을 찾지 못한 내부 캐싱을 수행합니다.

심플하고 효과적인 PDF 뷰어를 위해 제한된 기능만 필요한 경우 이제 (iOS 4.0+) QuickLook 프레임워크를 사용할 수 있습니다.

먼저 링크해야 합니다.QuickLook.framework그리고.#import <QuickLook/QuickLook.h>;

그 후, 어느 쪽이든viewDidLoad또는 저속 초기화 방식 중 하나를 사용합니다.

QLPreviewController *previewController = [[QLPreviewController alloc] init];
previewController.dataSource = self;
previewController.delegate = self;
previewController.currentPreviewItemIndex = indexPath.row;
[self presentModalViewController:previewController animated:YES];
[previewController release];

iOS 11 이후 PDF Kit라는 네이티브 프레임워크를 사용하여 PDF를 표시 및 조작할 수 있습니다.

PDFKit를 Import한 후PDFView로컬 또는 리모트 URL을 지정하여 뷰에 표시합니다.

if let url = Bundle.main.url(forResource: "example", withExtension: "pdf") {
    let pdfView = PDFView(frame: view.frame)
    pdfView.document = PDFDocument(url: url)
    view.addSubview(pdfView)
}

PDFKit 의 상세한 것에 대하여는, Apple Developer 의 메뉴얼을 참조해 주세요.

언급URL : https://stackoverflow.com/questions/3889634/fast-and-lean-pdf-viewer-for-iphone-ipad-ios-tips-and-hints