Pro รุ่น
Font Tools — การอ้างอิงเชิงลึก
ภาพรวมโดยสังเขป
หัวข้อที่มีชื่อว่า “ภาพรวมโดยสังเขป”หน้านี้เป็นการอ้างอิงระดับข้อกำหนดของ NextPDF Pro Font Tools พื้นผิวประกอบด้วยตัวสแกนหนึ่งตัวคือ NextPDF\Pro\FontTools\FontDesubsetter และวัตถุค่าที่ไม่เปลี่ยนแปลงได้สองตัวคือ SubsetInfo และ DesubsetPlan ตัวสแกนอ่านไบต์ PDF ดิบ รายงานทุกรายการ /BaseFont ที่แตกต่างกัน และทำเครื่องหมายรายการที่เป็นไปตามแบบแผนการตั้งชื่อซับเซ็ตของ ISO 32000-2:2020 §9.9.2 แผนงานจะรวมซับเซ็ตที่ถูกทำเครื่องหมายและประมาณต้นทุนไบต์ในการกู้คืนโปรแกรมฟอนต์ฉบับเต็ม โมดูลนี้ทำเพียงวิเคราะห์และประมาณเท่านั้น ไม่เคยเขียนโปรแกรมฟอนต์ที่ฝังอยู่ขึ้นใหม่ หน้านี้ระบุ API สาธารณะ ข้อกำหนดพฤติกรรมที่สังเกตได้ และโหมดความล้มเหลว
ความพร้อมใช้งานและการอนุญาตให้ใช้สิทธิ
หัวข้อที่มีชื่อว่า “ความพร้อมใช้งานและการอนุญาตให้ใช้สิทธิ”ความสามารถนี้มาพร้อมกับ NextPDF Pro (nextpdf/pro) และเปิดใช้งานด้วยซองใบอนุญาตระดับ Pro การปรับใช้งานที่ไม่มีสิทธิการใช้งานดังกล่าวจะไม่โหลดคลาสของความสามารถนี้ เปรียบเทียบรุ่นและขอใบอนุญาต
ไม่มีแฟล็กใบอนุญาตรายฟีเจอร์ที่จำกัดโมดูลนี้ คลาส Font Tools พร้อมใช้งานเสมอเมื่อมีการติดตั้ง nextpdf/pro
พื้นผิว API สาธารณะ
หัวข้อที่มีชื่อว่า “พื้นผิว API สาธารณะ”| Symbol | Parameters | Default behavior | Returns | Throws or fails with | Notes |
|---|---|---|---|---|---|
FontDesubsetter | none | ตัวสแกนไร้สถานะบนไบต์ PDF ดิบ | — | — | final ใช้ซ้ำข้ามเอกสารได้อย่างปลอดภัย |
FontDesubsetter::analyzeSubsets() | string $pdfData | รายงานทุกรายการ /BaseFont ที่แตกต่างกัน ไม่ว่าจะเป็นซับเซ็ตหรือไม่ ทำเครื่องหมายด้วย isSubset | list<SubsetInfo> | InvalidArgumentException เมื่อการประมาณซับเซ็ตที่ได้จากความกว้างเกินการประมาณจำนวนเต็มที่ได้จากชื่อ | สแกนระดับไบต์ สตรีมอ็อบเจกต์ที่บีบอัดจะไม่ถูกถอดรหัส |
FontDesubsetter::isSubsetFont() | string $baseFontName | จับคู่แบบแผนคำนำหน้าอักษรตัวพิมพ์ใหญ่หกตัวบวก + | bool | — | ยึดที่ต้นชื่อ |
FontDesubsetter::extractSubsetPrefix() | string $baseFontName | คืนแท็กซับเซ็ตหกตัวอักษร | string | — | คืนสตริงว่างสำหรับชื่อที่ไม่ใช่ซับเซ็ต |
FontDesubsetter::generateDesubsetPlan() | list<SubsetInfo> $subsets | รวบรวมรายการที่ isSubset เป็น true และรวมการประมาณขนาด | DesubsetPlan | ไม่โยนข้อยกเว้น | รายการที่ไม่ใช่ซับเซ็ตจะถูกข้ามไปโดยเงียบ |
SubsetInfo | constructor: $fontName, $baseFont, $subsetGlyphCount, $fullGlyphCount, $isSubset, $encoding | คำอธิบายที่ไม่เปลี่ยนแปลงได้ของหนึ่งรายการ /BaseFont | — | InvalidArgumentException เมื่อจำนวนกลีฟติดลบ หรือจำนวนซับเซ็ตเกินจำนวนเต็ม | final readonly คุณสมบัติทั้งหมดเป็น public |
SubsetInfo::subsetPrefix() | none | สกัดแท็กหกตัวอักษรจาก fontName | string | — | คืนสตริงว่างเมื่อไม่ใช่ซับเซ็ตหรือ + อยู่นอกตำแหน่งที่หก |
SubsetInfo::coveragePercent() | none | สัดส่วนซับเซ็ตของชุดกลีฟทั้งหมด | float ใน [0.0, 100.0] | — | คืน 0.0 เมื่อ fullGlyphCount เป็น 0 |
DesubsetPlan | constructor: list<SubsetInfo> $targets, int $estimatedSizeIncrease | แผน de-subset ที่ไม่เปลี่ยนแปลงได้ | — | — | final readonly คุณสมบัติทั้งหมดเป็น public |
DesubsetPlan::count() | none | จำนวนฟอนต์เป้าหมาย | int | — | เท่ากับความยาวของ targets |
DesubsetPlan::totalGlyphsNeeded() | none | กลีฟที่ขาดหายรวมทุกเป้าหมาย | int | — | ผลรวมของ fullGlyphCount - subsetGlyphCount ต่อเป้าหมาย |
ลายเซ็นจุดเข้าใช้งาน
หัวข้อที่มีชื่อว่า “ลายเซ็นจุดเข้าใช้งาน”public function analyzeSubsets(string $pdfData): array
public function isSubsetFont(string $baseFontName): bool
public function extractSubsetPrefix(string $baseFontName): string
public function generateDesubsetPlan(array $subsets): DesubsetPlanpublic function __construct( public string $fontName, public string $baseFont, public int $subsetGlyphCount, public int $fullGlyphCount, public bool $isSubset, public string $encoding,)
public function subsetPrefix(): string
public function coveragePercent(): floatpublic function __construct( public array $targets, public int $estimatedSizeIncrease,) {}
public function count(): int
public function totalGlyphsNeeded(): intข้อกำหนดด้านพฤติกรรม
หัวข้อที่มีชื่อว่า “ข้อกำหนดด้านพฤติกรรม”การสแกนและการตรวจจับซับเซ็ต
หัวข้อที่มีชื่อว่า “การสแกนและการตรวจจับซับเซ็ต”analyzeSubsets() สกัดโทเคนชื่อ /BaseFont จากไบต์ดิบด้วยการจับคู่แพตเทิร์นระดับไบต์ ชื่อที่ซ้ำกันจะยุบเป็นรายการเดียว ลำดับเป็นไปตามการปรากฏครั้งแรก ทุกชื่อที่แตกต่างกันจะให้ SubsetInfo ไม่ว่าจะเป็นซับเซ็ตหรือไม่ ชื่อจะเป็นซับเซ็ตเมื่อขึ้นต้นด้วยอักษร ASCII ตัวพิมพ์ใหญ่หกตัวพอดีตามด้วย + ซึ่งเป็นแบบแผน §9.9.2 สำหรับชื่อซับเซ็ต baseFont คือชื่อที่ตัดคำนำหน้าเจ็ดตัวอักษรออก สำหรับชื่อทั่วไป baseFont เท่ากับ fontName ชื่อซับเซ็ตแต่ละชื่อที่แตกต่างกันจะถูกรายงานเป็นรายการของตัวเอง ตรงตามคำแนะนำ §9.9.2 ที่ให้ปฏิบัติต่อซับเซ็ตในฐานะหน่วยอิสระ
การตรวจจับการเข้ารหัส
หัวข้อที่มีชื่อว่า “การตรวจจับการเข้ารหัส”สำหรับแต่ละฟอนต์ ตัวสแกนจะค้นหาในหน้าต่างไบต์ที่มีขอบเขตหลังการปรากฏของ /BaseFont รายการชื่อ /Encoding ในหน้าต่างจะมีความสำคัญเหนือกว่า หากไม่พบ จะรายงานสตริงย่อย Identity-H หรือ Identity-V ในหน้าต่าง หากไม่พบทั้งสอง รายการจะรายงานเป็น Unknown ค่าการเข้ารหัสที่เก็บอยู่ในดิกชันนารีหรือเข้าถึงผ่านการอ้างอิงทางอ้อมจะรายงานเป็น Unknown
การบัญชีกลีฟ
หัวข้อที่มีชื่อว่า “การบัญชีกลีฟ”จำนวนกลีฟทั้งสองเป็นค่าประมาณ subsetGlyphCount ได้มาจากอาร์เรย์ความกว้างที่มองเห็นได้ใกล้รายการฟอนต์ อาร์เรย์ /W ของ CIDFont ให้ราวหนึ่งกลีฟต่อทริปเปิลความกว้าง และอาร์เรย์ /Widths ของฟอนต์อย่างง่ายให้หนึ่งกลีฟต่อรายการตัวเลข เมื่อไม่มีอาร์เรย์ใดมองเห็นได้ในหน้าต่าง จะใช้ค่าเริ่มต้นคงที่เล็กน้อย เมื่อไม่สามารถระบุตำแหน่งการปรากฏของ /BaseFont เพื่อการค้นหาในหน้าต่าง จำนวนจะเป็น 0 fullGlyphCount ได้มาจากฮิวริสติกชื่อตระกูล ได้แก่ ตารางของตระกูล Latin ที่รู้จักดี ชุดตัวบ่งชี้ชื่อตระกูล CJK และค่าพื้นในกรณีอื่น โปรแกรมฟอนต์ที่ฝังอยู่จะไม่ถูกแยกวิเคราะห์ ตาราง ขนาดหน้าต่าง และค่าคงที่เฉพาะเป็นรายละเอียดการนำไปใช้ ไม่ได้เผยแพร่ และอาจเปลี่ยนแปลงระหว่างเวอร์ชัน
การสร้างแผนงาน
หัวข้อที่มีชื่อว่า “การสร้างแผนงาน”generateDesubsetPlan() กรองอินพุตให้เหลือรายการที่ isSubset เป็น true แต่ละเป้าหมายจะมีส่วนร่วมด้วยจำนวนกลีฟที่ขาดหาย คูณด้วยค่าคงที่ไบต์เฉลี่ยต่อกลีฟ เข้าสู่ estimatedSizeIncrease แผนงานเป็นการคาดการณ์สำหรับการตัดสินใจด้านความจุ ไม่ใช่เดลตาที่วัดได้ การดำเนินการตามแผน — การเขียนโปรแกรมฟอนต์ขึ้นใหม่ — อยู่นอกขอบเขตของโมดูลนี้
ความเป็นเชิงกำหนด
หัวข้อที่มีชื่อว่า “ความเป็นเชิงกำหนด”พื้นผิวทั้งหมดเป็นฟังก์ชันบริสุทธิ์ของอินพุต ไบต์ที่เหมือนกันให้ผลลัพธ์ที่เหมือนกัน ไม่มีความสุ่ม ไม่มีการเรียกเครือข่าย และไม่มีการเข้าถึงระบบไฟล์
กรณีขอบและโหมดความล้มเหลว
หัวข้อที่มีชื่อว่า “กรณีขอบและโหมดความล้มเหลว”- การสร้าง
SubsetInfoปฏิเสธสถานะที่ไม่ถูกต้อง จำนวนกลีฟที่ติดลบ หรือจำนวนซับเซ็ตที่เกินจำนวนเต็ม จะโยนInvalidArgumentException analyzeSubsets()สามารถส่งต่อข้อยกเว้นนั้นได้ในกรณีหนึ่ง ฟอนต์ที่ชื่อตรงกับตระกูลที่รู้จัก แต่อาร์เรย์ความกว้างที่มองเห็นได้ให้การประมาณซับเซ็ตที่ใหญ่กว่าตัวเลขจำนวนเต็มของตระกูลนั้น- การตรวจจับทำงานบนการแทนเป็นไบต์ รายการ
/BaseFontที่ทำให้เป็นอนุกรมภายในสตรีมอ็อบเจกต์ที่บีบอัดจะมองไม่เห็น ให้คลายการบีบอัดสตรีมเหล่านั้นก่อนสแกน - รายการที่คีย์และค่า
/BaseFontถูกคั่นด้วยช่องว่างอื่นที่ไม่ใช่ช่องว่างเดี่ยว ยังคงถูกตรวจจับได้ แต่การค้นหาในหน้าต่างต่อฟอนต์จะล้มเหลวในการระบุตำแหน่ง รายการเช่นนี้จะรายงานการเข้ารหัสเป็นUnknownและจำนวนกลีฟซับเซ็ตเป็น0 - ชื่อ PDF ที่ใช้ไบต์แบบ
#-escaped จะถูกรายงานในรูปแบบ escaped ดิบ ไม่มีการถอดรหัส escape - ชื่อ
/BaseFontที่ซ้ำกันจะยุบเป็นรายการเดียว อ็อบเจกต์ฟอนต์ที่แตกต่างกันสองตัวที่ใช้ชื่อเดียวกันจะแยกไม่ออกสำหรับตัวสแกนนี้ generateDesubsetPlan()ไม่เคยล้มเหลวกับอินพุตที่ไม่ใช่ซับเซ็ต รายการที่isSubsetตั้งเป็นfalseจะถูกกันออกจากtargetsเท่านั้น- จำนวนทั้งหมดและ
estimatedSizeIncreaseเป็นฮิวริสติก อย่าถือเป็นค่าที่วัดได้ ใช้เพื่อการคัดกรองและการวางแผนความจุเท่านั้น - ไม่มีการดำเนินการเข้ารหัสลับเกิดขึ้นในโมดูลนี้ จึงไม่มีพฤติกรรมเฉพาะโหมด FIPS
ความสอดคล้อง
หัวข้อที่มีชื่อว่า “ความสอดคล้อง”| Claim | Standard | Clause |
|---|---|---|
การตรวจจับซับเซ็ตตรงกับแบบแผนการตั้งชื่อซับเซ็ต แท็กอักษรตัวพิมพ์ใหญ่หกตัวตามด้วย + นำหน้าค่า BaseFont | ISO 32000-2:2020 | §9.9.2 |
| ชื่อซับเซ็ตแต่ละชื่อที่แตกต่างกันถูกรายงานอย่างอิสระ ตามคำแนะนำให้ปฏิบัติต่อซับเซ็ตหลายตัวในฐานะหน่วยแยกกัน | ISO 32000-2:2020 | §9.9.2 |
ทุกอนุประโยคเป็นการถอดความ NextPDF ไม่ได้ทำซ้ำข้อความบรรทัดฐาน สิ่งเหล่านี้เป็นการระบุความสามารถ ไม่ใช่การรับรอง NextPDF ไม่ถือครองการรับรองใดและไม่มอบการรับรองใด โมดูลยืนยันการตรวจจับแบบแผนการตั้งชื่อและการรายงานเชิงกำหนด ไม่ได้ยืนยันความแม่นยำของการประมาณจำนวนกลีฟหรือขนาด
บันทึกการพัฒนา
หัวข้อที่มีชื่อว่า “บันทึกการพัฒนา”- ติดตั้งด้วย
composer require nextpdf/pro:^3มีให้ใช้งานตั้งแต่nextpdf/pro1.9.0 ปัจจุบันอยู่ในnextpdf/pro3.1.0 FontDesubsetterไร้สถานะ สร้างครั้งเดียวและใช้ซ้ำข้ามเอกสารและเธรดงาน- ป้อนไบต์ที่คลายการบีบอัดแล้วให้
analyzeSubsets()เมื่อความครอบคลุมของซับเซ็ตมีความสำคัญ มิฉะนั้นดิกชันนารีฟอนต์ที่บรรจุในสตรีมอ็อบเจกต์จะถูกมองข้าม - แตกกิ่งบน
SubsetInfo::isSubsetก่อนดำเนินการ รายการผลลัพธ์รวมฟอนต์ที่ไม่ใช่ซับเซ็ตโดยเจตนาเพื่อวัตถุประสงค์ในการทำบัญชี - ใช้
DesubsetPlan::totalGlyphsNeeded()และestimatedSizeIncreaseเพื่อตัดสินว่าการ de-subset คุ้มค่ากับต้นทุนขนาดไฟล์หรือไม่ ก่อนจัดหาโปรแกรมฟอนต์ฉบับเต็ม - การสแกนเป็นเชิงเส้นตามความยาวอินพุตพร้อมการค้นหาในหน้าต่างต่อฟอนต์ที่มีขอบเขต โมดูลไม่จัดเก็บสิ่งใดและไม่ปล่อยเทเลเมทรี
ขอบเขตการเผยแพร่
หัวข้อที่มีชื่อว่า “ขอบเขตการเผยแพร่”หน้านี้บันทึกเฉพาะพฤติกรรมที่สังเกตได้จากภายนอกและพื้นผิว API สาธารณะที่รองรับเท่านั้น เส้นทาง namespace ภายใน คลาสตัวช่วย ตารางกลไก ชื่อไฟล์ runbook และคำนำหน้า ticket อยู่นอกขอบเขต
ดูเพิ่มเติม
หัวข้อที่มีชื่อว่า “ดูเพิ่มเติม”- Font Tools (ความสามารถ) — การติดตั้ง การเริ่มต้นอย่างรวดเร็ว และตัวอย่างเวิร์กโฟลว์การวางแผน
- Optimizer — การอ้างอิงเชิงลึก — พื้นผิวการลดขนาดที่เป็นพี่น้องกัน รวมถึงการเพิ่มประสิทธิภาพที่เกี่ยวกับฟอนต์
- Core font module — การฝังและการทำซับเซ็ตฟอนต์ระหว่างการสร้างเอกสารใน NextPDF Core