เมื่อไม่นานมานี้มีคำถามมากมายเกี่ยวกับการวาด PDF
ใช่คุณสามารถแสดงผล PDF ได้อย่างง่ายดายด้วยUIWebView
แต่มันไม่สามารถให้ประสิทธิภาพและการทำงานที่คุณคาดหวังจากโปรแกรมดู PDF ที่ดี
คุณสามารถวาดหน้าไฟล์ PDF ไปยัง CALayerหรือเพื่อ UIImage Apple ยังมีรหัสตัวอย่างเพื่อแสดงวิธีการวาด PDF ขนาดใหญ่ใน Zoomable UIScrollview
แต่ปัญหาเดียวกันก็ยังคงมีอยู่
วิธี UIImage:
- PDF ในขนาดที่
UIImage
ไม่ออพติคอลรวมถึงวิธีการเลเยอร์ - CPU และหน่วยความจำได้รับผลกระทบ
UIImages
จากการPDFcontext
จำกัด / ป้องกันการใช้เพื่อสร้างการเรนเดอร์แบบเรียลไทม์ของระดับการซูมใหม่
วิธี CATiledLayer:
- มีค่าโสหุ้ยที่สำคัญ (เวลา) การวาดหน้าเต็มรูปแบบ PDF ไปที่
CALayer
: แต่ละแผ่นสามารถมองเห็นการแสดงผล (แม้จะมีการปรับขนาดกระเบื้อง) CALayers
ไม่สามารถเตรียมล่วงหน้า (แสดงนอกหน้าจอ)
โดยทั่วไปแล้วโปรแกรมดู PDF นั้นค่อนข้างหนักในหน่วยความจำเช่นกัน แม้แต่ตรวจสอบการใช้หน่วยความจำของตัวอย่าง PDF ที่ซูมได้ของ Apple
ในโครงการปัจจุบันของฉันฉันกำลังพัฒนาโปรแกรมดู PDF และกำลังแสดงUIImage
หน้าหนึ่งในเธรดแยกต่างหาก (ปัญหาที่นี่ด้วย!) และนำเสนอในขณะที่สเกลคือ x1 CATiledLayer
การเรนเดอร์จะเริ่มขึ้นในทันทีที่สเกลเป็น> 1 iBooks ใช้แนวทางแบบสองครั้งที่คล้ายคลึงกันราวกับว่าคุณเลื่อนหน้าเว็บคุณสามารถดูรุ่นความละเอียดต่ำกว่าของหน้าเว็บในเวลาน้อยกว่าหนึ่งวินาทีก่อนที่จะมีหน้าจอคมชัดปรากฏขึ้น
การแสดงผล 2 หน้าแต่ละด้านของหน้าอยู่ในโฟกัสเพื่อให้ภาพ PDF พร้อมที่จะปิดบังเลเยอร์ก่อนที่จะเริ่มวาดหน้าเพจจะถูกทำลายอีกครั้งเมื่อพวกเขาอยู่ที่ +2 หน้าออกจากหน้าที่มุ่งเน้น
ใครบ้างมีความเข้าใจไม่ว่าเล็กหรือชัดเจนในการปรับปรุงประสิทธิภาพ / การจัดการหน่วยความจำของ Drawing PDF หรือไม่? หรือปัญหาอื่น ๆ ที่กล่าวถึงที่นี่?
แก้ไข:เคล็ดลับบางอย่าง (เครดิต - Luke Mcneice, VdesmedT, Matt Gallagher, Johann):
บันทึกสื่อใด ๆ ลงในดิสก์เมื่อคุณสามารถ
ใช้ไทล์ขนาดใหญ่ขึ้นหากการเรนเดอร์บน TiledLayers
init อาร์เรย์ที่ใช้บ่อยกับวัตถุตัวยึด alternitively อีกวิธีการออกแบบเป็นอย่างใดอย่างหนึ่ง
โปรดทราบว่ารูปภาพจะแสดงเร็วกว่า
CGPDFPageRef
ใช้
NSOperations
หรือ GCD & บล็อกเพื่อเตรียมหน้าล่วงหน้าโทร
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
ก่อนCGContextDrawPDFPage
เพื่อลดการใช้หน่วยความจำขณะวาดเริ่มต้น
NSOperations
ด้วยdocRef ของคุณเป็นความคิดที่ไม่ดี (หน่วยความจำ), ห่อ docRef ลงในซิงเกิลยกเลิกความจำเป็น
NSOperations
เมื่อคุณทำได้โดยเฉพาะอย่างยิ่งหากพวกเขาจะใช้หน่วยความจำระวังอย่าเปิดบริบทแม้ว่า!รีไซเคิลหน้าวัตถุและทำลายมุมมองที่ไม่ได้ใช้
ปิดบริบทที่เปิดทันทีที่คุณไม่ต้องการ
เมื่อได้รับคำเตือนจากหน่วยความจำและรีโหลด DocRef และแคชหน้าใด ๆ
คุณสมบัติ PDF อื่น ๆ :
รับลิงค์ใน PDF (และที่นี่และที่นี่ )
รับเป้าหมายของลิงก์ (รับหมายเลขหน้าจาก
/Dest
อาร์เรย์)
รับข้อความแบบดิบ (และที่นี่และที่นี่และที่นี่ (เน้นตำแหน่ง)
กำลังค้นหา (และที่นี่ ) (ใช้ไม่ได้กับ PDF ทั้งหมด (บางตัวแสดงตัวอักษรแปลก ๆ ฉันเดาว่ามันเป็นปัญหาการเข้ารหัส แต่ฉันไม่แน่ใจ) --Credit BrainFeeder)
CALayer และ Off-Screen Rendering - แสดงหน้าถัดไปเพื่อการแสดงผลที่รวดเร็ว / ราบรื่น
เอกสาร
- Quartz PDFObjects (ใช้สำหรับข้อมูลเมตา, คำอธิบายประกอบ, นิ้วโป้ง)
- Abobe PDF Spec
ตัวอย่างโครงการ
- Apple / ZoomingPDF - ซูม
UIScrollView
,,CATiledLayer
- VFR / อ่าน - ซูมเพจ
UIScrollView
,CATiledView
- คิ้ว / ใบไม้ - เพจจิ้งที่มีการเปลี่ยนที่ดี
- / skim - ทุกอย่างที่ปรากฏ (ตัวอ่าน PDF / ตัวแก้ไขสำหรับ OSX)
PSPDFKit
มันไม่ถูก แต่คุ้มค่า: pspdfkit.com