빠르고 슬림한 iPhone/iPad/iOS용 PDF 뷰어 - 힌트?
최근 PDF 도면에 대한 많은 질문이 있었습니다.
PDF를 수 .UIWebView
그러나 이것은 좋은 PDF 뷰어에서 기대할 수 있는 성능과 기능을 제공할 수 없습니다.
PDF 페이지를 CALayer 또는 UELMage에 그릴 수 있습니다.애플은 확대 가능한 UIScrollview에서 큰 PDF를 그리는 방법을 보여주는 샘플 코드도 갖추고 있습니다.
하지만 같은 문제가 계속 발생하고 있습니다.
UIMage 방법:
- PDF 입니다.
UIImage
광학적으로 확장하거나 레이어 접근 방식을 사용하지 마십시오. - 시 했습니다.
UIImages
PDFcontext
제한/제한을 사용하여 새 확대/축소 렌더의 실시간 렌더를 만듭니다.
CATiled Layer 메서드:
- 페이지 데 상당한 가 소요됩니다.
CALayer
의 타일을 수 해도 표시 가능). 개개의 타일을 렌더링 할 수 있습니다(타일 사이즈를 조정해도 표시 가능). 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 기능:
-
링크 대상 가져오기(에서 페이지 번호 가져오기)
/Dest
array(어레이를 참조해 주세요.
검색(및 여기서) (모든 PDF에서 사용할 수 있는 것은 아닙니다(일부에서는 이상한 문자만 표시되며 인코딩 문제일 수도 있지만 잘 모르겠습니다) - Credit BrainFeeder)
문서
- Quartz PDFObjects(메타 정보, 주석, 엄지손가락에 사용)
- Abobe 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 를 획득한다.CGPDFPage
CTM을 사용하다★★★의 - (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);
}
}
는 이슈를 담고 입니다.CGPDFDocumentRef
pdfDoc
memoryWarnings를 때 작성하기 에 속성을 합니다....인 것 .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
'programing' 카테고리의 다른 글
범위 내에서 부분 텍스트 찾기, 인덱스 반환 (0) | 2023.04.14 |
---|---|
PowerShell의 Clear-History가 이력을 클리어하지 않음 (0) | 2023.04.14 |
python에서 nice 열 출력을 만듭니다. (0) | 2023.04.09 |
Swift에서 "포장되지 않은 가치"란 무엇입니까? (0) | 2023.04.09 |
Swift 5.1로 컴파일된 모듈은 Swift 5.1.2 컴파일러에서 가져올 수 없습니다. (0) | 2023.04.09 |