ข้ามไปยังเนื้อหา
getnextpdf.com

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

SymbolParametersDefault behaviorReturnsThrows or fails withNotes
FontDesubsetternoneตัวสแกนไร้สถานะบนไบต์ PDF ดิบfinal ใช้ซ้ำข้ามเอกสารได้อย่างปลอดภัย
FontDesubsetter::analyzeSubsets()string $pdfDataรายงานทุกรายการ /BaseFont ที่แตกต่างกัน ไม่ว่าจะเป็นซับเซ็ตหรือไม่ ทำเครื่องหมายด้วย isSubsetlist<SubsetInfo>InvalidArgumentException เมื่อการประมาณซับเซ็ตที่ได้จากความกว้างเกินการประมาณจำนวนเต็มที่ได้จากชื่อสแกนระดับไบต์ สตรีมอ็อบเจกต์ที่บีบอัดจะไม่ถูกถอดรหัส
FontDesubsetter::isSubsetFont()string $baseFontNameจับคู่แบบแผนคำนำหน้าอักษรตัวพิมพ์ใหญ่หกตัวบวก +boolยึดที่ต้นชื่อ
FontDesubsetter::extractSubsetPrefix()string $baseFontNameคืนแท็กซับเซ็ตหกตัวอักษรstringคืนสตริงว่างสำหรับชื่อที่ไม่ใช่ซับเซ็ต
FontDesubsetter::generateDesubsetPlan()list<SubsetInfo> $subsetsรวบรวมรายการที่ isSubset เป็น true และรวมการประมาณขนาดDesubsetPlanไม่โยนข้อยกเว้นรายการที่ไม่ใช่ซับเซ็ตจะถูกข้ามไปโดยเงียบ
SubsetInfoconstructor: $fontName, $baseFont, $subsetGlyphCount, $fullGlyphCount, $isSubset, $encodingคำอธิบายที่ไม่เปลี่ยนแปลงได้ของหนึ่งรายการ /BaseFontInvalidArgumentException เมื่อจำนวนกลีฟติดลบ หรือจำนวนซับเซ็ตเกินจำนวนเต็มfinal readonly คุณสมบัติทั้งหมดเป็น public
SubsetInfo::subsetPrefix()noneสกัดแท็กหกตัวอักษรจาก fontNamestringคืนสตริงว่างเมื่อไม่ใช่ซับเซ็ตหรือ + อยู่นอกตำแหน่งที่หก
SubsetInfo::coveragePercent()noneสัดส่วนซับเซ็ตของชุดกลีฟทั้งหมดfloat ใน [0.0, 100.0]คืน 0.0 เมื่อ fullGlyphCount เป็น 0
DesubsetPlanconstructor: 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): DesubsetPlan
public 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(): float
public 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
ClaimStandardClause
การตรวจจับซับเซ็ตตรงกับแบบแผนการตั้งชื่อซับเซ็ต แท็กอักษรตัวพิมพ์ใหญ่หกตัวตามด้วย + นำหน้าค่า BaseFontISO 32000-2:2020§9.9.2
ชื่อซับเซ็ตแต่ละชื่อที่แตกต่างกันถูกรายงานอย่างอิสระ ตามคำแนะนำให้ปฏิบัติต่อซับเซ็ตหลายตัวในฐานะหน่วยแยกกันISO 32000-2:2020§9.9.2

ทุกอนุประโยคเป็นการถอดความ NextPDF ไม่ได้ทำซ้ำข้อความบรรทัดฐาน สิ่งเหล่านี้เป็นการระบุความสามารถ ไม่ใช่การรับรอง NextPDF ไม่ถือครองการรับรองใดและไม่มอบการรับรองใด โมดูลยืนยันการตรวจจับแบบแผนการตั้งชื่อและการรายงานเชิงกำหนด ไม่ได้ยืนยันความแม่นยำของการประมาณจำนวนกลีฟหรือขนาด

  • ติดตั้งด้วย composer require nextpdf/pro:^3 มีให้ใช้งานตั้งแต่ nextpdf/pro 1.9.0 ปัจจุบันอยู่ใน nextpdf/pro 3.1.0
  • FontDesubsetter ไร้สถานะ สร้างครั้งเดียวและใช้ซ้ำข้ามเอกสารและเธรดงาน
  • ป้อนไบต์ที่คลายการบีบอัดแล้วให้ analyzeSubsets() เมื่อความครอบคลุมของซับเซ็ตมีความสำคัญ มิฉะนั้นดิกชันนารีฟอนต์ที่บรรจุในสตรีมอ็อบเจกต์จะถูกมองข้าม
  • แตกกิ่งบน SubsetInfo::isSubset ก่อนดำเนินการ รายการผลลัพธ์รวมฟอนต์ที่ไม่ใช่ซับเซ็ตโดยเจตนาเพื่อวัตถุประสงค์ในการทำบัญชี
  • ใช้ DesubsetPlan::totalGlyphsNeeded() และ estimatedSizeIncrease เพื่อตัดสินว่าการ de-subset คุ้มค่ากับต้นทุนขนาดไฟล์หรือไม่ ก่อนจัดหาโปรแกรมฟอนต์ฉบับเต็ม
  • การสแกนเป็นเชิงเส้นตามความยาวอินพุตพร้อมการค้นหาในหน้าต่างต่อฟอนต์ที่มีขอบเขต โมดูลไม่จัดเก็บสิ่งใดและไม่ปล่อยเทเลเมทรี

หน้านี้บันทึกเฉพาะพฤติกรรมที่สังเกตได้จากภายนอกและพื้นผิว API สาธารณะที่รองรับเท่านั้น เส้นทาง namespace ภายใน คลาสตัวช่วย ตารางกลไก ชื่อไฟล์ runbook และคำนำหน้า ticket อยู่นอกขอบเขต

  • Font Tools (ความสามารถ) — การติดตั้ง การเริ่มต้นอย่างรวดเร็ว และตัวอย่างเวิร์กโฟลว์การวางแผน
  • Optimizer — การอ้างอิงเชิงลึก — พื้นผิวการลดขนาดที่เป็นพี่น้องกัน รวมถึงการเพิ่มประสิทธิภาพที่เกี่ยวกับฟอนต์
  • Core font module — การฝังและการทำซับเซ็ตฟอนต์ระหว่างการสร้างเอกสารใน NextPDF Core