บันทึกประจำรุ่น PDFiumPas
ประวัติเวอร์ชันสำหรับคุณลักษณะที่ผู้ใช้เห็นของ PDFiumPas การแก้ไข การปรับปรุงตัวแสดง การสร้างเอกสาร เอาต์พุต PDF/A การเรนเดอร์ และการอัปเดตเอกสาร
รุ่นล่าสุด
- รุ่นล่าสุด: 2.57.0; วันที่วางจำหน่าย:
Version 2.57.0
เพิ่มแล้ว (Added)
TPdfThumbnailView.Orientationรองรับเลย์เอาต์ภาพย่อแนวตั้งและแนวนอน พร้อมคงค่าเริ่มต้นแนวตั้งเดิมไว้FirstVisiblePageIndex,LastVisiblePageIndexและEnsureCurrentPageVisibleเปิดเผยและควบคุมวิวพอร์ตของภาพย่อด้วยดัชนีหน้าแบบหนึ่งบน
เปลี่ยนแปลงแล้ว (Changed)
- การเปลี่ยน
CurrentPageIndexขณะนี้เลื่อนภาพย่อที่เลือกให้เข้าสู่มุมมองในทั้งสองทิศทาง - การทดสอบของ Delphi, Lazarus และ C++Builder ขณะนี้ครอบคลุมค่าเริ่มต้นของทิศทาง การสลับ ช่วงที่มองเห็น และการมองเห็นของหน้าที่เลือก
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.57.0 อย่างสม่ำเสมอ
Version 2.56.2
เปลี่ยนแปลงแล้ว (Changed)
HighlightSearchText,AddSearchTextHighlightและClearHighlightขณะนี้ทำให้เฉพาะสี่เหลี่ยมของอุปกรณ์สำหรับช่วงการค้นหาที่ถูกเพิ่มหรือลบเป็นโมฆะ แทนที่จะวาดตัวแสดงทั้งหมดใหม่- การแทนที่จุดเน้นด้วยรายการที่ตรงกันเดิม หรือการเพิ่มรายการที่ตรงกันซ้ำ ไม่จัดตารางการวาดใหม่ที่ไม่จำเป็นอีกต่อไป
- การทดสอบของ Delphi, Lazarus และ C++Builder ขณะนี้ครอบคลุมการยกเลิกที่ถูกจำกัด การอัปเดตแบบ idempotent การล้าง และความปลอดภัยของมุมมองที่ไม่ใช้งาน
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.56.2 อย่างสม่ำเสมอ
Version 2.56.1
เปลี่ยนแปลงแล้ว (Changed)
TPdfThumbnailViewขณะนี้นำบิตแมปที่เรนเดอร์แล้วกลับมาใช้ใหม่สำหรับหน้าที่ยังคงมองเห็นได้ข้ามการวาดใหม่และตำแหน่งการเลื่อนที่อยู่ติดกัน- แคชเก็บเฉพาะช่วงหน้าที่มองเห็นในปัจจุบันและปล่อยรายการอย่างแม่นยำเมื่อหน้าออกจากช่วงนั้น เมื่อเอกสารที่กำหนดเปลี่ยนแปลง หรือเมื่อขนาดภาพย่อเปลี่ยนแปลง
- การทดสอบของ Delphi, Lazarus และ C++Builder ขณะนี้ครอบคลุมการนำแคชกลับมาใช้ใหม่ การตัดวิวพอร์ต การยกเลิกตามขนาด การแทนที่เอกสาร และการทำลายคอมโพเนนต์
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.56.1 อย่างสม่ำเสมอ
Version 2.56.0
เพิ่มแล้ว (Added)
TPdfView.CutSelectedFormTextToClipboardและTPdfView.PasteFormTextFromClipboardจัดให้มีการแก้ไขคลิปบอร์ด Unicode สำหรับวิดเจ็ตฟอร์มที่โฟกัสและแก้ไขได้
เปลี่ยนแปลงแล้ว (Changed)
- ตัวแก้ไขฟอร์มที่โฟกัสขณะนี้จัดการแป้นพิมพ์ลัด copy, cut, paste และ select-all มาตรฐานก่อนที่จะส่งต่อข้อความป้อนเข้าไปยัง PDFium
- Cut และ paste ปฏิเสธฟิลด์แบบอ่านอย่างเดียวและเซสชันที่ไม่มีสิทธิ์เติมฟอร์มหรือแก้ไข ขณะที่ cut คัดลอกสำเร็จก่อนที่จะลบข้อความที่เลือก
- การทดสอบของ Delphi, Lazarus และ C++Builder ขณะนี้ครอบคลุมพฤติกรรมไม่มีโฟกัส การไปกลับของแป้นพิมพ์ลัด และการปฏิเสธแบบอ่านอย่างเดียว
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.56.0 อย่างสม่ำเสมอ
Version 2.55.0
เพิ่มแล้ว (Added)
TPdfView.AddSearchTextHighlightเพิ่มรายการที่ตรงกันแบบไม่ซ้ำสำหรับคำค้นหาอื่นเข้ากับการวางซ้อนหน้าปัจจุบัน ทำให้คำค้นหาหลายรายการคงเน้นไว้ด้วยกันได้
เปลี่ยนแปลงแล้ว (Changed)
HighlightSearchTextยังคงเป็นจุดเข้าใช้งานสำหรับการแทนที่ และขณะนี้แชร์ตัวสแกนแบบสะสม ขณะที่ช่วงอักขระที่ซ้ำกันถูกละเว้นและClearHighlightลบชุดที่สะสมทั้งหมดออก- การทดสอบของ Delphi, Lazarus และ C++Builder ขณะนี้ครอบคลุมการสะสมของคำค้นหาที่แตกต่างและการระงับช่วงที่ซ้ำกัน
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.55.0 อย่างสม่ำเสมอ
Version 2.54.0
เพิ่มแล้ว (Added)
TPdfขณะนี้เปิดเผยสแนปชอตวัตถุหน้าแบบสมบูรณ์ การอัปเดตสไตล์แบบกลุ่ม การแปลงวัตถุ affine ส่วนของเส้นทาง เส้นทางคลิป และรายการย่อยของ Form XObject- การตรวจสอบอักขระขณะนี้รวมสีเติมและสีเส้น ชื่อและแฟล็กของฟอนต์ ขอบเขต glyph แบบหลวม ๆ เมทริกซ์ที่มีผล แฮนเดิลออบเจกต์ข้อความ และการแปลงจากดัชนีอักขระเป็นดัชนีข้อความ
- คำอธิบายประกอบขณะนี้ทำงานไปกลับกับรูปทรงขอบและสตรีมลักษณะปกติ rollover และ down
- ตัวเข้าถึงภาพย่อแบบดิบและแบบถอดรหัสใหม่ การแปลงเนื้อหาหน้าและคำอธิบายประกอบ และ
RenderPageWithMatrixจัดให้มีเส้นทางการเรนเดอร์และการแก้ไขขั้นสูงโดยตรง
เปลี่ยนแปลงแล้ว (Changed)
- การเปลี่ยนแปลงสไตล์ของวัตถุหน้าสามารถ commit เป็นกลุ่มเดียวได้ เพื่อให้ PDFium สร้างเนื้อหาหน้าใหม่เพียงครั้งเดียว
- การเรนเดอร์เมทริกซ์ใช้เส้นทางบิตแมป zero-copy ที่มีอยู่เดิมเมื่อเลย์เอาต์บิตแมปปลายทางเข้ากันได้
Version 2.53.1
แก้ไขแล้ว (Fixed)
- คำบรรยายเมนู Copy ภาษาจีนในตัวขณะนี้ใช้จุดรหัส Unicode ที่เป็นอิสระจากการเข้ารหัส และแสดงผลถูกต้องในบิลด์ Lazarus
- ชุดเครื่องมือ Delphi รุ่นเก่าสามารถคอมไพล์
FPdfAsyncได้เมื่อยูนิตWinapi.Windowsของพวกมันละเว้นการประกาศGetTickCount64
Version 2.53.0
เพิ่มแล้ว (Added)
- ฟิกซ์เจอร์ทดสอบ
Tests.ApiCoverageใหม่ที่ครอบคลุม TPdf API สาธารณะที่ก่อนหน้านี้มีการครอบคลุมการทดสอบแบบ end-to-end เป็นศูนย์:GetPageBox/SetPageBox(อ่าน/เขียน MediaBox/CropBox ข้อผิดพลาดของกล่องที่หายไป และไปกลับของการบันทึก)FlattenPage/FlattenAllPages(ค่าที่ส่งกลับและการรักษาจำนวนหน้า)GenerateFormAppearances(no-op บนเอกสารที่ไม่ใช่ฟอร์ม)SaveAsEncrypted/SaveAsEncryptedToStream(AES-256 พร้อมไปกลับของรหัสผ่าน — ยืนยันว่าไฟล์ที่เข้ารหัสปฏิเสธที่จะเปิดโดยไม่มีรหัสผ่านและเปิดได้เมื่อมีรหัสผ่าน) การตรวจสอบขอบเขตของDeletePage(หน้า 0 และที่อยู่นอกช่วงเรียกEPdfError) และเซนตินเนลคำอธิบายประกอบHasContents/HasAuthorที่แนะนำใน v2.38.0 (ยืนยันว่าDefault(TPdfAnnotation)ปล่อยให้พวกมันเป็นFalse)
Version 2.52.0
เพิ่มแล้ว (Added)
TPdfView.CopySelectedFormTextToClipboardคัดลอกส่วนที่เลือกของข้อความภายในวิดเจ็ต AcroForm ที่โฟกัสไปยังคลิปบอร์ดของ Windows ในรูปแบบCF_UNICODETEXT
เปลี่ยนแปลงแล้ว (Changed)
- การดำเนินการคัดลอกข้อความหน้าและฟอร์มที่โฟกัสขณะนี้แชร์ตัวเขียนคลิปบอร์ด Unicode แบบป้องกันเดียวกัน และปล่อยให้คลิปบอร์ดไม่เปลี่ยนแปลงเมื่อส่วนที่เลือกว่างเปล่า
- การทดสอบของ Delphi, Lazarus และ C++Builder ขณะนี้ครอบคลุมการเรียกคัดลอกฟอร์มที่ไม่ใช้งานหรือไม่โฟกัส และการไปกลับของส่วนที่เลือกของฟอร์มที่โฟกัสผ่านคลิปบอร์ดของ Windows
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.52.0 อย่างสม่ำเสมอ
Version 2.51.0
เพิ่มแล้ว (Added)
TPdfView.SelectLineAtเลือกบรรทัดข้อความภาพที่ประกอบด้วยดัชนีหน้าแบบหนึ่งบนและดัชนีอักขระแบบศูนย์บนโดยไม่ต้องใช้อินพุตจากเมาส์
เปลี่ยนแปลงแล้ว (Changed)
- การเลือกบรรทัดแบบโปรแกรม การเลือกคลิกสามครั้ง และ
Shift+HomeหรือShift+Endขณะนี้แชร์โมเดลขอบเขตบรรทัดแบบกล่องอักขระเดียวกัน - การทดสอบของ Delphi, Lazarus และ C++Builder ขณะนี้ครอบคลุมการเลือกบรรทัดที่เสถียรและดัชนีหน้าหรืออักขระที่ไม่ถูกต้อง
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.51.0 อย่างสม่ำเสมอ
Version 2.50.0
เพิ่มแล้ว (Added)
TPdf.LoadDocumentขณะนี้ยอมรับหน้าต่างIndexและCountแบบศูนย์บนเข้าไปในบัฟเฟอร์TBytesทำให้สามารถโหลด PDF ที่ฝังอยู่ได้โดยไม่ต้องจัดสรรชิ้นส่วน byte-array ชั่วคราว
เปลี่ยนแปลงแล้ว (Changed)
- การโหลดช่วงไบต์ปฏิเสธหน้าต่างที่เป็นลบหรืออยู่นอกขอบเขตก่อนที่จะเปลี่ยนสถานะเอกสาร และคงตัวเลือกอายุการใช้งานบัฟเฟอร์และบัฟเฟอร์ที่ยืมมาเดิมไว้
- การทดสอบของ Delphi, Lazarus และ C++Builder ขณะนี้ครอบคลุมหน้าต่าง PDF ที่ฝังอยู่และอาร์กิวเมนต์ช่วงไบต์ที่ไม่ถูกต้อง
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.50.0 อย่างสม่ำเสมอ
Version 2.49.1
เพิ่มแล้ว (Added)
TPdfView.FitModeขณะนี้รองรับpfmFitHeightสำหรับปรับหน้าปัจจุบันให้พอดีกับความสูงของวิวพอร์ตที่มองเห็นได้ โดยอนุญาตให้เลื่อนแนวนอนเมื่อจำเป็น
แก้ไขแล้ว (Fixed)
- โหมดการปรับพอดีขณะนี้ลู่เข้าหลังจากการเปลี่ยนแปลงการมองเห็นแถบเลื่อนเปลี่ยนพื้นที่ไคลเอ็นต์ ทำให้ผลลัพธ์ fit-page, fit-width และ fit-height สอดคล้องกันระหว่าง VCL และ LCL
- การทดสอบตัวแสดงของ Delphi, Lazarus และ C++Builder ขณะนี้ครอบคลุมการเลือก
pfmFitHeightและการไปกลับของการแจงนับ TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.49.1 อย่างสม่ำเสมอ
Version 2.49.0
เพิ่มแล้ว (Added)
- พื้นผิวการเชื่อมโยงสาธารณะของ PDFium ขณะนี้ครอบคลุมฟังก์ชันที่ส่งออกทั้งหมด 470 รายการในส่วนหัวที่ตรวจทาน รวมถึงการเข้าถึงคำอธิบายสิ่งที่แนบผ่าน
FPDFAttachment_SetDescriptionและFPDFAttachment_GetDescription TPdfขณะนี้เปิดเผยคำอธิบายสิ่งที่แนบ ความถูกต้องของการอ้างอิงไขว้ ออฟเซตสิ้นสุด trailer ฉบับแก้ไขของ security-handler การโหลดหน่วยความจำ 64-บิต ช่วงไบต์ลายเซ็น ช่วงข้อความลิงก์เว็บ และสแนปชอตข้อมูลภาพ ตัวกรอง ข้อมูลเมตา และโพรไฟล์ ICC ที่ขยายขึ้น- ตัวช่วยฟอร์มขณะนี้รองรับโฟกัสฟิลด์เนทีฟ การสอบถามและอัปเดตตัวเลือกที่เลือกที่โฟกัส การส่งต่อลูกล้อเมาส์ เส้นหมึกที่เขียนได้ และการวางซ้อนฟอร์มหลังการเรนเดอร์แบบก้าวหน้า
เปลี่ยนแปลงแล้ว (Changed)
FormFieldCount, ดัชนีฟิลด์ฟอร์ม และลำดับแท็บ ขณะนี้อธิบายเฉพาะคำอธิบายประกอบ widget แทนที่จะรวมคำอธิบายประกอบหน้าที่ไม่เกี่ยวข้อง- หน้า
TPdfแบบไร้ส่วนหัวขณะนี้เข้าและออกจากวงจรชีวิตหน้าการเติมฟอร์ม เพื่อให้โฟกัสเนทีฟและ API ฟิลด์ที่โฟกัสทำงานโดยไม่ต้องมีTPdfView - การส่งออกคำอธิบายสิ่งที่แนบถูกจำกัดด้วยความสามารถ เพื่อให้แอปพลิเคชันที่ใช้บิลด์ PDFium ที่เก่ากว่ายังคงโหลดไลบรารีและตรวจหาคุณสมบัติที่ไม่พร้อมใช้งานได้
แก้ไขแล้ว (Fixed)
- การเรนเดอร์หน้าแบบก้าวหน้าขณะนี้วาดตัวควบคุมฟอร์มเมื่อเปิดใช้งานการเติมฟอร์ม
- การทดสอบ Delphi, Lazarus และ C++Builder ขณะนี้ครอบคลุมการวินิจฉัยเอกสารใหม่ คำอธิบายสิ่งที่แนบ เส้นทางหมึก พฤติกรรมฟอร์ม ช่วงไบต์ลายเซ็น ช่วงลิงก์เว็บ และข้อมูลเมตาของภาพ
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.49.0 อย่างสม่ำเสมอ
Version 2.48.0
เพิ่มแล้ว (Added)
TPdfMatrixขณะนี้เปิดเผยโรงงาน การโคลนและการกำหนด การวินิจฉัยสถานะจำกัดและความสามารถในการผกผัน การเปรียบเทียบตามค่าคลาดเคลื่อน การเข้าถึงการแปล การรายงานดีเทอร์มิแนนต์ และการสลายแบบอะฟีน- องค์ประกอบ prepend การหมุนที่ตระหนักถึงจุดหมุน การปรับสเกล การเอียงและการพลิก บวกการแมปสี่เหลี่ยม stretch, contain และ cover รองรับเวิร์กโฟลว์พื้นที่ภายในและเลย์เอาต์ที่ปรับพอดีโดยไม่ต้องคำนวณสัมประสิทธิ์ด้วยตนเอง
- การเข้าถึงผกผันแบบไม่เปลี่ยนแปลง การแมปจุดผกผัน การแปลงเวกเตอร์และสี่เหลี่ยม ชุดจุดและสี่เหลี่ยมแบบไดนามิก ตัวแปร in-place และขอบเขตที่แปลงแล้วในหนึ่งรอบ ขยายพื้นผิวเรขาคณิตที่ใช้ซ้ำได้
เปลี่ยนแปลงแล้ว (Changed)
- การแปล การปรับสเกลและการพลิกแกน ขณะนี้อัปเดตเฉพาะสัมประสิทธิ์ที่ได้รับผลกระทบแทนการกำหนดเส้นทางผ่านการคูณอะฟีนทั่วไป
- การแปลงสี่เหลี่ยมทำให้ข้อมูลเข้าเป็นมาตรฐานหนึ่งครั้ง ใช้เส้นทางแนวแกนเฉพาะที่แม่นยำเมื่อเป็นไปได้ และคำนวณขอบเขตที่หมุนทั่วไปโดยไม่มีเรกคอร์ดจุดชั่วคราว
- การแปลงชุดจุดและสี่เหลี่ยมจัดสรรอาร์เรย์ผลลัพธ์หนึ่งอาร์เรย์หรือใช้ที่จัดเก็ของผู้เรียกซ้ำ ในขณะที่ขอบเขตจุดที่แปลงแล้วสะสมในหนึ่งรอบโดยไม่มีอาร์เรย์กลาง
แก้ไขแล้ว (Fixed)
- การแมปสี่เหลี่ยมปฏิเสธผลลัพธ์ขนาดศูนย์ ที่ไม่จำกัด และที่ล้น
Singleก่อนเผยแพร่เมทริกซ์ที่ใช้ไม่ได้ - การทดสอบ Delphi, Lazarus และ C++Builder ขณะนี้ตรวจสอบลำดับองค์ประกอบ อนวาเรียนต์ของจุดหมุน การไปกลับผกผัน สี่เหลี่ยมที่ปรับพอดี การสลาย และพฤติกรรมเรขาคณิตจำนวนมาก
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.48.0 อย่างสม่ำเสมอ
Version 2.47.0
เพิ่มแล้ว (Added)
FPdfAsyncขณะนี้ให้เหตุผลและข้อความการยกเลิกแบบมีโครงสร้าง การลงทะเบียนการเรียกกลับที่ถอดออกได้ แหล่งที่มาตามระยะหมดเวลา การรอการยกเลิก และการดำเนินการ try-cancel แบบอะตอมผ่านอินเทอร์เฟซขยายที่รักษา API เดิมTPdfFuture<T>.RunExเพิ่มการจัดส่งคำตอบและลำดับความสำคัญของผู้ปฏิบัติงานที่กำหนดค่าได้ ในขณะที่ซองผลลัพธ์เปิดเผย ID การดำเนินการ ความถูกต้องของค่า ชื่อคลาสข้อยกเว้น การวัดเวลาเสร็จสมบูรณ์ และตัวช่วยเสร็จสมบูรณ์ที่ใช้ซ้ำได้TPdfAsyncExecutorเพิ่มพูลผู้ปฏิบัติงานคงที่ที่ใช้ซ้ำได้พร้อมช่องลำดับความสำคัญ FIFO สี่ช่อง แรงต้านคิวจำกัดเสริม แฮนเดิลงานที่ยกเลิกได้ การรอที่ตระหนักถึงระยะหมดเวลา สแนปชอตงาน สถิติรวม และการปิดระบบอย่างสง่างาม
เปลี่ยนแปลงแล้ว (Changed)
- งานอะซิงโครนัสซ้ำสามารถใช้เธรดผู้ปฏิบัติงานและการดำเนินการคิว O(1) ซ้ำแทนการสร้างเธรดสำหรับทุกงาน ในขณะที่การเสร็จสมบูรณ์แบบซิงโครไนซ์ยังคงพร้อมใช้งานสำหรับโฮสต์ UI
- ความล้มเหลวของตัวดำเนินการและ future รักษาการวินิจฉัยคลาสและข้อความข้อยกเว้น การยกเลิกรักษาเหตุผลเดิม และข้อยกเว้นการเรียกกลับยังคงแยกจากวงจรชีวิตผู้ปฏิบัติงานและการปิดระบบ
- การทดสอบ Delphi, Lazarus และ C++Builder ขณะนี้ครอบคลุมพื้นผิวการยกเลิกที่ขยาย ข้อมูลเมตา future การควบคุมงาน แรงต้าน การเรียงลำดับความสำคัญ สถิติ ความล้มเหลว และการปิดระบบ
แก้ไขแล้ว (Fixed)
- เจ้าของการยกเลิกพร้อมกันขณะนี้ได้รับผลลัพธ์ผู้เขียนคนแรกที่กำหนดแน่นอนแทนที่จะพึ่งพาลำดับการสังเกตและการยกเลิกแยกต่างหาก
- การรอพักของเธรดหลักประมวลผลคำตอบงานซิงโครไนซ์ ป้องกันไม่ให้ผู้ปฏิบัติงานที่เสร็จสมบูรณ์ทิ้งตัวดำเนินการให้อยู่ในสถานะไม่พักอย่างถาวรระหว่างการปิดระบบที่ประสานงาน
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.47.0 อย่างสม่ำเสมอ
Version 2.46.0
เพิ่มแล้ว (Added)
FPdfAsn1ขณะนี้เปิดเผยคลาสตัวระบุ การเข้ารหัสและถอดรหัสหมายเลขแท็กสูง 64-บิต เรกคอร์ด TLV ที่แยกวิเคราะห์ หน้าต่างตัวอ่านลูกแบบคัดลอกศูนย์ ตัวถอดรหัสดั้งเดิมแบบมีประเภท และส่วนย่อยของเนื้อหาหรือค่าที่เข้ารหัส- ตัวเขียน DER ขณะนี้รองรับช่วง INTEGER 64-บิตไม่มีเครื่องหมายเต็ม เนื้อหา INTEGER ตามอำเภอใจที่ตรวจสอบแล้ว ENUMERATED การเลือก UTCTime หรือ GeneralizedTime อัตโนมัติ แท็ก application และ private SEQUENCE หลายค่า และเอาต์พุต SET OF ที่จัดเรียงตามบัญญัติ
ValidateDerส่งกลับข้อผิดพลาดการตรวจสอบที่ตระหนักถึงออฟเซตในขณะที่บังคับใช้ขีดจำกัดการซ้อน จำนวนโหนด ความยาวเนื้อหา จำนวนข้อผิดพลาด รูท และการเรียงลำดับ SET เสริมที่กำหนดค่าได้
เปลี่ยนแปลงแล้ว (Changed)
- การต่อ DER และองค์ประกอบหลายค่าใช้การจัดสรรเอาต์พุตหนึ่งครั้ง บัฟเฟอร์ตัวเขียนเปิดเผยการดำเนินการ reserve, count, capacity และการโอนความเป็นเจ้าของ และการเรียงลำดับ SET OF ขณะนี้ใช้การเรียงลำดับผสาน
O(n log n) - ค่า BOOLEAN, INTEGER, BIT STRING, OBJECT IDENTIFIER, NULL, UTF8String, PrintableString, IA5String, UTCTime และ GeneralizedTime ได้รับการตรวจสอบรูปแบบบัญญัติระหว่างการเข้ารหัส การถอดรหัสแบบมีประเภท หรือการตรวจสอบ
- แพ็กเกจรันไทม์ Lazarus ขณะนี้ส่งออก
FPdfAsn1และชุดทดสอบ Delphi, Lazarus และ C++Builder ฝึกพื้นผิว DER สาธารณะเดียวกัน
แก้ไขแล้ว (Fixed)
- หมายเลขแท็กเฉพาะบริบทที่มากกว่า 30 ไม่ถูกตัดทอนลงในห้าบิตตัวระบุต่ำอีกต่อไป
- ตัวระบุแท็กสูงที่ผิดรูป ความยาวที่กำหนดไม่น้อยที่สุด UTF-8 ที่ไม่ถูกต้อง ช่องว่างภายใน BIT STRING ที่ไม่เป็นศูนย์ ช่องเวลาที่ไม่ถูกต้อง รูทต่อท้าย และการละเมิดขีดจำกัดทรัพยากร ถูกปฏิเสธอย่างกำหนดแน่นอน
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.46.0 อย่างสม่ำเสมอ
Version 2.45.0
เพิ่มแล้ว (Added)
FPdfPreflightReportขณะนี้กำหนดความรุนแรง Info, Warning หรือ Error ให้กับทุกปัญหาและเปิดเผย API ความรุนแรง สถานะ หมวดหมู่ รหัสปัญหา การค้นหา การค้นหา การปรับให้แบน และการกรองในระดับมาตรฐานและรายงาน- รายงาน preflight ขณะนี้ส่งออก SARIF 2.1.0, JUnit XML, NDJSON และ XML ดั้งเดิมผ่านเมธอด
To*และSave*ToFileที่ตรงกันสำหรับไปป์ไลน์ CI, อัตโนมัติ และสตรีมมิ่ง - ลายนิ้วมือรายงาน SHA-256 ที่เสถียรระบุผลลัพธ์การตรวจสอบที่เทียบเท่าโดยไม่ขึ้นกับเส้นทางแหล่งที่มาและเวลาที่สร้าง
เปลี่ยนแปลงแล้ว (Changed)
- รายงาน JSON, CSV, text, Markdown และ HTML ขณะนี้รวมความรุนแรงและสรุปสถานะที่ขยาย HTML เพิ่มคำบรรยายตารางที่เข้าถึงได้และสรุปสถานะ
- การสร้างคอลเลกชันปัญหาและมาตรฐานใช้การเติบโตของความจุทางเรขาคณิต ผลลัพธ์การสอบถามถูกกำหนดขนาดล่วงหน้า การหลีกเลี่ยง JSON เขียนไปยังบัฟเฟอร์เอาต์พุตที่จำกัดหนึ่งบัฟเฟอร์ และไฟล์รายงานทั้งหมดใช้ตัวเขียน UTF-8 โดยตรงหนึ่งตัว
- สรุปหมวดหมู่ปัญหาใช้การเรียงลำดับที่กำหนดแน่นอน เวลาประทับรวมมิลลิวินาที JSON พก
formatVersion: 2และเซลล์ CSV ทำให้สูตรสเปรดชีตเป็นกลาง
แก้ไขแล้ว (Fixed)
- การส่งออก JSON ขณะนี้รักษาคู่ Unicode เสริมที่ถูกต้องและแทนที่หน่วยโค้ดตัวแทน UTF-16 ที่แยกออกแทนที่จะปล่อยข้อมูลสเกลาร์ที่ผิดรูป
- การส่งออก HTML ขณะนี้หลีกเลี่ยงเครื่องหมายอะพอสตรอฟี และมุมมองรายงานที่กรองเป็นเจ้าของอาร์เรย์ปัญหาอิสระแทนที่จะแชร์ที่เก็บผลลัพธ์ที่เปลี่ยนแปลงได้
TPdf.AboutInfo, ข้อมูลเมตาของแพ็กเกจ Lazarus และข้อมูลเมตาของตัวติดตั้ง ขณะนี้รายงาน Version 2.45.0 อย่างสม่ำเสมอ
Version 2.44.0
เพิ่ม (Added)
- บุ๊กมาร์กและปลายทางเปิดเผยสถานะการเปิด จำนวนรายการสืบทอด เป้าหมายของแอ็กชัน โหมดมุมมองปลายทาง และพารามิเตอร์มุมมองสูงสุดสี่รายการ
Metadata,GrantedPermissions,UserGrantedPermissions,HasPermissionและUserHasPermissionมอบสแนปชอตการตรวจสอบเอกสารแบบมีชนิดข้อมูลและการสอบถามสิทธิ์การใช้งานExtractThumbnail(PageNumber)เรนเดอร์หน้าที่ระบุโดยไม่เปลี่ยนแปลงหน้าปัจจุบันที่กำลังใช้งาน และผลลัพธ์ของการประทับเวลา RFC 3161 เปิดเผยรายละเอียดนโยบาย เวลาที่สร้าง และค่า nonce
เปลี่ยนแปลง (Changed)
- เส้นทางของบุ๊กมาร์ก JavaScript เมทาดาต้า ปลายทาง และภาพย่อใช้บัฟเฟอร์แบบสองพาสที่ผ่านการตรวจสอบ การเติบโตของคอลเลกชันแบบเรขาคณิต และการสำรวจแบบปลอดภัยจากรอบการอ้างอิง
- การประมวลผลหลังบันทึกของ Save จะแก้ไขแคตตาล็อกปัจจุบัน แผนผังหน้า และแอ็กชันการเปิดผ่านเวอร์ชันการแก้ไข xref ปัจจุบัน แคชอ็อบเจ็กต์สตรีมที่ถอดรหัสแล้ว และสแกนพจนานุกรม PDF ด้วยขอบเขตเชิงคำศัพท์
- การแจงส่วน PDF ที่ใช้ร่วมกันบังคับใช้ส่วนหัวของอ็อบเจ็กต์ที่แน่นอน เจเนอเรชัน คีย์พจนานุกรม ความยาวสตรีม เรขาคณิตพรีดิกเตอร์ ช่วงจำนวนเต็ม รวมถึงขอบเขตของความคิดเห็น สตริงสัญพจน์ และสตริงเลขฐานสิบหก
- การตรวจสอบความถูกต้องของการตอบกลับ RFC 3161 ผูกทั้งค่า nonce และ
messageImprintแบบ SHA-256 เข้าด้วยกัน กำหนดให้ต้องมีผู้ลงนามที่มีโครงสร้างถูกต้อง และใช้กฎความยาว DER, OID, INTEGER และ GeneralizedTime แบบเข้มงวด
แก้ไข (Fixed)
- เอกสารแบบเพิ่มหน่วยไม่สามารถเลือกแคตตาล็อกที่ซ้ำกันและไม่ใช้งานอยู่หรือคำต่อท้ายการอ้างอิงที่มีรูปแบบไม่ถูกต้องได้อีกต่อไปเมื่อเพิ่มแอ็กชันการเปิดเริ่มต้น
- โทเค็นการประทับเวลาที่มีความยาว DER แบบลองก์ฟอร์มจะยังคงรักษาโทเค็นที่เข้ารหัสแบบสมบูรณ์ไว้ ขณะที่การจัดลำดับฟิลด์ตัวเลือกของ CMS ที่มีรูปแบบไม่ถูกต้องและเซตผู้ลงนามที่ว่างเปล่าจะถูกปฏิเสธ
- บิลด์ Delphi แบบสะอาดเขียนฟิลด์ nonce seed ของ PAdES ผ่านการคัดลอกไบต์แบบ aligned-safe และส่งไบต์การตอบกลับ XFA ด้วยชนิดพอยน์เตอร์เนทีฟที่ถูกต้องตรง
Version 2.43.0
เพิ่ม (Added)
- เรคคอร์ดฟิลด์และคำอธิบายประกอบ XFDF ในตอนนี้เปิดเผยแฟล็กการมีอยู่ที่แยกแยะระหว่างค่า XML ที่ถูกละไว้กับค่าว่างที่กำหนดอย่างชัดเจน
เปลี่ยนแปลง (Changed)
- การนำเข้า XFDF ยอมรับอิลิเมนต์และแอตทริบิวต์ที่มีคำนำหน้าเนมสเปซ เนื้อหาแบบผสมระหว่างข้อความกับ CDATA เอนทิตี้อ้างอิง และค่าที่ช่องว่างมีนัยสำคัญ ในขณะที่ปฏิเสธการอ้างอิงสเกลาร์ Unicode ที่ไม่ถูกต้อง
- การนำเข้าและส่งออก XFDF ใช้การจับคู่ฟิลด์แบบทำดัชนีและบัฟเฟอร์เรขาคณิตแบบจำกัดขอบเขต ช่วยปรับปรุงอัตราการรับส่งข้อมูลและพฤติกรรมการจัดสรรหน่วยความจำสูงสุดสำหรับฟอร์มที่ซ้อนกันลึก คอลเลกชันคำอธิบายประกอบขนาดใหญ่ รายการหมึก จุดยอด และสี่เหลี่ยมของมาร์กอัป
- การตรวจสอบความถูกต้องของ PDF/A และ PDF/UA ใช้การเติบโตแบบจำกัดขอบเขตสำหรับคอลเลกชันหน้า สตรีม ชื่อโครงสร้าง และ RoleMap ขนาดใหญ่ และการแก้ไข RoleMap ของ PDF/UA ในตอนนี้จะติดตามอาร์เรย์โดยตรงและอ็อบเจ็กต์ชื่อหรืออาร์เรย์ทางอ้อมที่มีเจเนอเรชันเป๊ะ
แก้ไข (Fixed)
- การส่งผ่านข้อมูลไปกลับของ XFDF ในตอนนี้รักษาเส้นทางฟิลด์ที่ซ้อนกันลึก ค่าฟิลด์ว่างที่กำหนดอย่างชัดเจน เนื้อหาคำอธิบายประกอบว่างที่กำหนดอย่างชัดเจน และความแตกต่างระหว่างเนื้อหาที่ไม่มีอยู่กับเนื้อหาว่าง
- การโหลดบัฟเฟอร์หน่วยความจำที่ไม่ถูกต้องและการกำหนดหน้าที่อยู่นอกช่วงจะถูกปฏิเสธโดยไม่ทิ้งสถานะของเอกสารหรือหน้าบางส่วนไว้ และการโหลดหน้าเนทีฟใหม่ที่ล้มเหลวจะรักษาหน้าปัจจุบันที่เคยใช้งานอยู่ก่อนหน้านี้ไว้
- ตัวระบุเนื้อหาที่ทำเครื่องหมายขนาดใหญ่และบัฟเฟอร์เมทาดาต้าลายเซ็นจะถูกจำกัดขอบเขตและตรวจสอบความถูกต้องก่อนการจัดสรรหรือการเข้าถึงระดับเนทีฟ
Version 2.42.0
เพิ่ม (Added)
TPdfMatrixในตอนนี้มอบInvert,TryInvert,TransformPointและTransformRectสำหรับการแมปพิกัด การทดสอบการกด ขอบเขตที่ทำให้เป็นมาตรฐาน และการจัดการเมทริกซ์เอกพันธุ์อย่างชัดเจนTPdf.WrapTextเพิ่มโอเวอร์โหลดBreakLongWordsที่แยก CJK และข้อความอื่นๆ ที่ไม่มีช่องว่างโดยยังคงรักษาคู่ซัร์โรเกต UTF-16 ที่ถูกต้องไว้ด้วยกันTPdfAnnotation.AttachmentPointSetsเปิดเผยสี่เหลี่ยมทุกรูปในคำอธิบายประกอบมาร์กอัปหลายบรรทัด ขณะที่ฟิลด์AttachmentPointsเดิมยังคงเป็นชื่อแทนของเซตแรกอยู่
เปลี่ยนแปลง (Changed)
- การสกัดข้อความ การสร้างเนื้อหาที่อ่านได้ การค้นหาคำ และการแมปออฟเซตข้อความที่ออกเสียงได้ ในตอนนี้ใช้การจัดสรรแบบจำกัดขอบเขตและเส้นทางการค้นหาแบบทวิภาค ช่วยลดการจัดสรรซ้ำๆ และการสแกนเชิงเส้นบนหน้าขนาดใหญ่
- การทำให้เป็นอนุกรม ASN.1 และการสร้าง PDF ที่เข้ารหัสในตอนนี้ใช้บัฟเฟอร์เอาต์พุตแบบเรขาคณิต การจัดเรียงอ็อบเจ็กต์ที่เข้ารหัสใช้การเรียงลำดับแบบ
O(n log n)และแถว xref จะถูกเขียนลงบัฟเฟอร์สุดท้ายโดยตรง WrapTextรักษาขอบเขตของบรรทัด CR, LF และ CRLF และนำวัตถุการวัดเนทีฟเดียวกันมาใช้ซ้ำตลอดทั้งการทำงาน- การนำเข้าและส่งออก XFDF รักษาสี่เหลี่ยมของมาร์กอัปทุกรูป การนำเข้ายังปรับใช้สี RGB/สีภายในและแจงส่วนพิกัดทศนิยมอย่างเป็นอิสระจากโลเคลของกระบวนการอีกด้วย
แก้ไข (Fixed)
- ผู้เรียกแบบเดิมสามารถอัปเดตเนื้อหาและผู้สร้างของคำอธิบายประกอบได้อีกครั้งโดยการกำหนดสตริงที่ไม่ว่างเปล่าโดยไม่ต้องตั้งค่าตัวเฝ้าระวัง
HasContentsและHasAuthorรุ่นใหม่ - สตริงคำอธิบายประกอบที่กำหนดให้ว่างเปล่าอย่างชัดเจนในตอนนี้ใช้บัฟเฟอร์เนทีฟแบบ zero-terminated ที่ถูกต้อง ดังนั้นการล้าง
/Contents,/Tและคีย์ข้อความตัวเลือกอื่นๆ จะไม่ส่งพอยน์เตอร์ nil ไปยัง PDFium อีกต่อไป
Version 2.41.0
เปลี่ยนแปลง (Changed)
- รายงาน Preflight
SaveJsonToFile,SaveMarkdownToFileและSaveTextToFileเขียนไฟล์ด้วย UTF-8 บน Delphi แล้ว (ตรงกับSaveHtmlToFileที่มีอยู่เดิม) แทนที่จะเป็นรหัสโค้ดเพจ ANSI ของระบบ ทำให้อักขระ non-ASCII ในพาธไฟล์ คำแนะนำ และบันทึกขอบเขตไม่เกิดความเสียหายเมื่อบันทึกผ่านเมธอดเหล่านี้ SaveCsvToFileเขียนไฟล์ด้วย UTF-8 พร้อมกับส่วนนำหน้า BOM เพื่อให้ Excel บน Windows ตรวจหาการเข้ารหัสโดยอัตโนมัติ หากไม่มี BOM ทาง Excel จะมองว่า UTF-8 CSV นั้นเป็น code-page 1252 และทำให้อักขระ non-ASCII เสียหาย
แก้ไข (Fixed)
- ตัวอย่างสาธิต
ExtractImagesมีการรั่วไหลของวัตถุTBitmapที่แคชไว้ในFExtractedImagesเมื่อปิดฟอร์มโดยไม่ได้ล้างแคชอย่างชัดเจนก่อน ในตอนนี้ฟอร์มได้ทำการแทนที่ (override)Destroyเพื่อเรียกClearExtractedImagesและปลดปล่อยหน่วยความจำบิตแมปที่แคชไว้ทั้งหมด
Version 2.40.0
เปลี่ยนแปลง (Changed)
TPdf.RenderPage(HDC, ...)ทำการปิดบัง (mask) ข้อยกเว้น FPU/SSE รอบการเรียกใช้FPDF_RenderPageแล้ว เพื่อให้สอดคล้องกับTPdfView.RenderPage(HDC)(ได้รับการแก้ไขแล้วใน v2.25.0) รวมถึงจุดเข้าใช้งานสำหรับการเรนเดอร์ทั้งหมดที่คืนค่าเป็นบิตแมป โดยก่อนหน้านี้เมธอดโอเวอร์โหลดระดับTPdfที่วาดตรงไปยัง DC ไม่ได้ปิดบังข้อยกเว้น FPU บนคอมไพเลอร์ที่เก่ากว่า D12
แก้ไข (Fixed)
ColorToARGBคืนค่าพิกเซลแบบโปร่งใสอย่างสมบูรณ์ (ค่าอัลฟาเป็น 0) สำหรับclNoneและclDefaultแทนที่จะประมวลผลค่าเฝ้าระวังดังกล่าวเป็นสี RGB ตรงๆ โดยพฤติกรรมก่อนหน้านี้จะสร้างการเติมสีเข้มที่เกือบจะทึบแสงเมื่อผู้เรียกส่งค่าclNoneโดยคาดหวังผลลัพธ์ว่า “ไม่มีสี”
Version 2.39.1
แก้ไข (Fixed)
- การบันทึก PDF 1.3 อย่างชัดเจน จะทำการลบรายการ
/SMask /None,/AIS falseและ/TK trueซึ่งมีหน้าที่เพียงแค่ทำซ้ำสถานะกราฟิกเริ่มต้น ขณะเดียวกันยังคงปฏิเสธสถานะความโปร่งใสที่ไม่ใช่ค่าเริ่มต้น
Version 2.39.0
เปลี่ยนแปลง (Changed)
CreatePDFและImageToPDFใช้ปลายทางบันทึกที่ได้รับการยืนยันแล้ว และรายงานความสำเร็จเฉพาะเมื่อการทำงานSaveAsเสร็จสมบูรณ์เรียบร้อยแล้วเท่านั้นBatchExport,PDFtoJpgและSplitPDFจะจัดสรรไดเรกทอรีเอาต์พุตที่ไม่ซ้ำกันในขณะนี้ เพื่อให้การเรียกใช้งานซ้ำและการใช้อินพุตที่มีชื่อเดียวกันยังคงรักษารายการผลลัพธ์ก่อนหน้าไว้ได้SplitViewค้นหาวนกลับรอบเดียวโดยไม่ทิ้งสถานะหน้าเว็บที่ซ่อนอยู่ไว้เบื้องหลังหลังจากยกเลิกหรือไม่มีรายการที่ตรงกัน และจะยกเลิกงานพิมพ์ที่ไม่เสร็จสมบูรณ์แทนที่จะส่งเอาต์พุตเพียงบางส่วนออกมา
แก้ไข (Fixed)
MergePDFปฏิเสธโทเค็นช่วงหน้าที่มีรูปแบบไม่ถูกต้องและพาธเอาต์พุตที่เขียนทับซอร์สโค้ด นับจำนวนหน้าที่ถูกนำเข้าจริง และปฏิเสธการบันทึกผลลัพธ์ที่ว่างเปล่า- ตัวอย่างสาธิต
Attachmentของ Delphi และ C++Builder จะดำเนินการบันทึกในพาธเดียวกันผ่านการแทนที่ไฟล์ที่ปลอดภัยจากการย้อนกลับ (rollback-safe) เพื่อให้ความล้มเหลวในการเปลี่ยนชื่อไม่ไปลบไฟล์ PDF ต้นฉบับ
Version 2.38.0
เปลี่ยนแปลง (Changed)
SetAnnotationDataป้องกันการเขียน/Contentsและ/Authorด้วยตัวเฝ้าระวังHasContents/HasAuthorบนTPdfAnnotationแล้ว ซึ่งเป็นรูปแบบที่สอดคล้องกับHasName/HasSubject/HasIconที่มีอยู่เดิม โดยก่อนหน้านี้สองฟิลด์นี้ถูกเขียนแบบไม่มีเงื่อนไข ทำให้การกำหนดเรคคอร์ดDefault(TPdfAnnotation)เพื่ออัปเดตเฉพาะสีหรือแฟล็กไปเขียนทับเนื้อหาและผู้สร้างเดิมของคำอธิบายประกอบด้วยสตริงว่างอย่างเงียบๆ ทั้งนี้GetPageAnnotationได้ตั้งค่าตัวเฝ้าระวังเหล่านี้แล้ว วงจรการอ่าน-แก้ไข-เขียนใหม่จึงรักษารายการข้อมูลค่าดั้งเดิมไว้ได้
แก้ไข (Fixed)
GenerateFormAppearancesอ่านค่าปุ่มตัวเลือก/กล่องเลือกผ่านFPDFAnnot_GetFormFieldValue(ซึ่งค้นหาพจนานุกรมฟิลด์พาเรนต์ตามข้อกำหนด ISO 32000-1 §12.7.5) แทนการใช้FPDFAnnot_GetStringValue(Annot, 'V', ...)(ซึ่งอ่านพจนานุกรมวิดเจ็ต) เนื่องจากปกติแล้ววิดเจ็ตจะไม่มีรายการ/Vทำให้/ASไม่ได้รับการซิงค์ตามสถานะที่เลือก และการทำให้กล่องเลือก/ปุ่มตัวเลือกแบนราบลงแสดงผลเป็นแบบไม่ได้เลือก
Version 2.37.0
เปลี่ยนแปลง (Changed)
ParseTsaUrlทำการจำกัดค่าพอร์ตให้อยู่ในขอบเขต1..65535หลังจากการแจงส่วน เนื่องจากหากค่าพอร์ตมีขนาดใหญ่เกินไปอาจเกิดการปัดเศษด้วยการตัดทอนDWORDและอาจไปตรงกับพอร์ตที่ถูกต้องได้- XFDF
ParseFieldรองรับพารามิเตอร์ระดับความลึก (ค่าเริ่มต้นคือ 0 และจำกัดไว้สูงสุดที่ 64) และจะคืนค่าฟิลด์ว่างเมื่อถึงขีดจำกัด ส่งผลให้การเชื่อมโยงของโหนด<field>ที่ซ้อนกันอย่างเป็นอันตรายลึกถึง 100 000 ชั้นไม่ทำให้เกิดสแต็กโอเวอร์โฟลว์ (stack overflow) อีกต่อไป
แก้ไข (Fixed)
- คำขอ HTTP ของ TSA ป้องกันไม่ให้ส่งเนื้อหาคำขอที่ว่างเปล่าก่อนส่งค่า
@ReqDer[0]ไปยังWinHttpSendRequestการอ้างอิงพอยน์เตอร์อาร์เรย์แบบไดนามิกที่มีขนาดศูนย์อาจเกิดการเข้าถึงพอยน์เตอร์ที่ไม่มีการจัดสรรหน่วยความจำ แม้ว่าBuildTimeStampReqคืนค่า SEQUENCE ที่ไม่ว่างเสมอ แต่ในตอนนี้จุดเรียกใช้งานดังกล่าวได้เพิ่มการป้องกันตามสัญญาข้อกำหนดแล้ว
หมายเหตุ (Notes)
- ความคิดเห็นส่วนหัวของไฟล์
FPdfTsaWinเกี่ยวกับการตรวจสอบการเพิกถอน HTTPS ได้รับการแก้ไขให้ถูกต้องแล้ว กล่าวคือ WinHttp จะตรวจสอบความถูกต้องของสายใบรับรองเซิร์ฟเวอร์โดยค่าเริ่มต้น แต่จะไม่ดำเนินการตรวจสอบการเพิกถอน CRL/OCSP ยกเว้นว่าจะเปิดใช้งานอย่างชัดเจนผ่านWinHttpSetOptionโดยการใช้คำพูดก่อนหน้านี้ที่ระบุว่าการตรวจสอบการเพิกถอนนั้น “ได้มาฟรี” เป็นเรื่องที่ทำให้เกิดความเข้าใจผิดได้
Version 2.36.0
เปลี่ยนแปลง (Changed)
- คำขอ HTTP ของ TSA ในตอนนี้ส่งส่วนหัว
Content-Lengthอย่างชัดเจน เพิ่มเติมจากส่วนหัวContent-TypeและAcceptแม้ว่า WinHttp จะสร้างขึ้นมาเองจากความยาวทั้งหมดอยู่แล้ว แต่พร็อกซี RFC 3161 บางตัวต้องการส่วนหัวที่ระบุอย่างชัดเจนนี้ มิฉะนั้นจะปฏิเสธคำขอด้วยข้อผิดพลาด411 Length Required - การส่งออก XFDF จะละทิ้งอักขระควบคุม C0 ในตอนนี้ (นอกเหนือจาก TAB/LF/CR ที่ถูกแปลงรหัสหลีกอยู่แล้ว) แทนการส่งออกลำดับเลขฐานสิบหกที่มีเครื่องหมายทับขวา (backslash-hex) ที่ไม่ถูกต้อง โดยรหัสหลีก
\-01Fก่อนหน้านี้ไม่ใช่ XML ที่ถูกต้อง (เครื่องหมายทับขวาไม่มีความหมายพิเศษใน XML) ส่งผลให้โปรแกรมอ่านที่สอดคล้องกับมาตรฐานจะปฏิเสธเอกสารเนื่องจากมีรูปแบบที่ไม่ถูกต้อง InjectAssociatedFilesจะเขียนค่า/Subtypeลงในพจนานุกรมสตรีม EmbeddedFile แล้วเมื่อผู้เรียกใช้ระบุTAssociateFile.MIMETypeฟิลด์ดังกล่าวได้รับการประกาศและบันทึกไว้ในเอกสารแล้ว แต่ก่อนหน้านี้ตัวแทรกเขียนค่ารหัสแบบตายตัว (hard-coded) เป็น/Type /EmbeddedFileและละเลยฟิลด์นี้ไป (ข้อกำหนด ISO 32000-2 §7.11.4 อนุญาตให้ใส่/Subtypeบนสตรีมได้)
แก้ไข (Fixed)
- การนำเข้า XFDF ข้ามไบต์แรกของเนื้อหาหลังจาก UTF-8 BOM และไบต์แรกเมื่อไม่มี BOM เนื่องจาก
BytesToAnsi(Bytes, 4, ...)(มี BOM) และBytesToAnsi(Bytes, 1, ...)(ไม่มี BOM) ใช้ตำแหน่งเริ่มต้นคลาดเคลื่อนไป 1 ตำแหน่ง เนื่องจากBytesToAnsiรับค่าดัชนีอาร์เรย์ที่เริ่มต้นด้วย 0 ซึ่งในตอนนี้ได้แก้ไขการเรียกใช้ให้เป็น3และ0 ExtractSignatureValueมีข้อผิดพลาดในการย่อหน้าเงื่อนไขifซ้อนสองตำแหน่ง โดยที่R.Position:= CNทำงานโดยไม่มีเงื่อนไขสำหรับสาขาตัวเลือกcertificates [0]และsignedAttrs [0]ในขณะนี้ได้หุ้มสาขาดังกล่าวด้วยbegin/endแล้วเพื่อให้ตำแหน่งเลื่อนไปเฉพาะเมื่อมีการอ่าน TLV ตัวเลือกเท่านั้น (เป็นข้อผิดพลาดประเภทเดียวกันที่ได้รับการแก้ไขแล้วในAddSignatureTimestampToCmsใน v2.22.0)
Version 2.35.0
เปลี่ยนแปลง (Changed)
TFPDFAvail_IsDocAvail,TFPDFAvail_IsPageAvailและTFPDFAvail_IsFormAvailรับค่าพารามิเตอร์hints: PFX_DOWNLOADHINTSแทนการใช้var hints: FX_DOWNLOADHINTSส่งผลให้โหมดสืบค้นข้อมูลอย่างเดียวnullptrที่บันทึกไว้ในเอกสาร (ตรวจสอบความพร้อมใช้งานในปัจจุบันโดยไม่ต้องร้องขอข้อมูลเพิ่มเติม) สามารถเรียกใช้งานได้จาก Delphi ทั้งนี้ส่วนหัว PDFium อนุญาตให้พารามิเตอร์hintsเป็นโมฆะได้ แต่การผูกกับvarก่อนหน้านี้ทำให้ไม่สามารถทำเช่นนั้นได้TFPDF_SetSystemFontInfoรับค่าพารามิเตอร์pFontInfo: PFPDF_SYSFONTINFOแทนการใช้var pFontInfo: FPDF_SYSFONTINFOเพื่อให้ผู้เรียกส่งค่าnilเพื่อบอกให้ PDFium หยุดใช้อินเทอร์เฟซแบบอักษรระบบที่ลงทะเบียนไว้ก่อนหน้านี้ได้ (พาธการปิดใช้งานตามเอกสารประกอบ)TPdfThumbnailView.Paintคำนวณค่าVisibleRowsด้วยสูตรเดียวกับUpdateScrollBarRange(ClientHeight div RowHeight) เพื่อให้จำนวนแถวที่ถูกวาดตรงกับขนาดหน้าของแถบเลื่อน ในขณะที่สูตรสำหรับวาดอย่างเดียวในอดีต ((ClientHeight - FMarginY) div RowHeight + 1) อาจมีความแตกต่างกัน 1 แถวที่ความสูงขอบจอ ซึ่งทำให้สิ้นเปลืองทรัพยากรการเรนเดอร์ในแถวที่อยู่นอกหน้าจอหรือทำให้พลาดแถวสุดท้ายที่มองเห็นได้
Version 2.34.0
เพิ่ม (Added)
TPdf.SaveAsEncrypted/SaveAsEncryptedToStream— API ระดับสูงที่จะบันทึกเอกสารและเข้ารหัสข้อมูลด้วย PDF 2.0 AES-256-CBC (V=5/R=5/R=6) โดยจะรับค่าโครงสร้างTPdfEncryptOptionsพร้อมรหัสผ่านผู้ใช้/เจ้าของ สิทธิ์การใช้งาน และเวอร์ชันแก้ไขปรับปรุง (revision) และมอบหมายหน้าที่การทำงานไปยังEncryptDocumentBytes- การเข้ารหัสสตริงสัญพจน์ (literal-string) StrF:
EncryptDocumentBytesเข้ารหัสสตริงสัญพจน์(...)ในอ็อบเจ็กต์ที่ไม่ใช่สตรีม (เช่น พจนานุกรม Info และอื่นๆ) เป็นสตริงฐานสิบหกของ AES-256-CBC เพื่อให้ตรงกับรูปแบบการเข้ารหัสสตรีม (16-byte IV + ข้อความเข้ารหัส PKCS7) โดยจะไม่มีการแก้ไขสตริงฐานสิบหก<...>
Version 2.33.0
เพิ่ม (Added)
- ระบบแทรกการเข้ารหัส AES-256-CBC แบบเต็มเอกสารในยูนิต
FPdfEncrypt.pasฟังก์ชันEncryptDocumentBytesรับค่า PDF ข้อความธรรมดาและรหัสผ่าน ทำการเข้ารหัสอ็อบเจ็กต์สตรีมทางอ้อมทั้งหมด (16-byte IV + AES-256-CBC PKCS7 ภายใต้คีย์ไฟล์) ปรับแก้ค่า/Lengthผนวกพจนานุกรมอ็อบเจ็กต์/Encryptและสร้างตารางการอ้างอิงไขว้แบบดั้งเดิม (cross-reference table) ที่สมบูรณ์พร้อมส่วนต่อท้ายที่มี/Encryptและ/IDซึ่งจะทำให้สแต็กการเข้ารหัส PDF 2.0 ทำงานได้อย่างสมบูรณ์ (AES block + GCM + SHA-512/384 + การสร้างคีย์ R6 + พจนานุกรม + การสแกนเอกสาร) - ตัวช่วย
EncryptStreamPayload— รูปแบบสตรีม PDF 2.0 AES-256 (IV อยู่หน้าข้อความเข้ารหัส AES-CBC-PKCS7) ที่ผู้เรียกใช้นำกลับมาใช้ซ้ำในการจัดการเค้าโครงวัตถุของตนเองได้
Version 2.32.0
เพิ่ม (Added)
- แฮช SHA-512 / SHA-384 (FIPS 180-4) ในยูนิตใหม่
FPdfSha512.pasซึ่งเป็นแบบ Pure-Pascal ที่พอร์ตมาจาก HotPDF จำเป็นสำหรับลูปการแปลงแฮชรหัสผ่าน PDF 2.0 R6 ซึ่งจะแยกสาขาตามค่า mod-3 ของข้อมูล 128 บิตเพื่อเลือกใช้ SHA-256/384/512 ในแต่ละรอบ ได้รับการทวนสอบความถูกต้องด้วยคำตอบการทดสอบที่ทราบล่วงหน้าตาม FIPS-180-4 B.1 แล้ว - การสร้างคีย์เข้ารหัส PDF 2.0 และตัวสร้างพจนานุกรม Encrypt ในยูนิตใหม่
FPdfEncrypt.pasดำเนินการตามอัลกอริทึม 2.B ของข้อกำหนด ISO 32000-2 §7.6.4.3 (R6 hash dance: AES-128-CBC + การเลือกใช้ SHA-256/384/512 แบบทำซ้ำ) ดึงข้อมูลคีย์เข้ารหัสไฟล์ขนาด 32 ไบต์ ร่วมถึงรายการ/O,/U,/OE,/UE,/Permsและสร้างพจนานุกรม Encrypt ของ V=5/R=5/R=6 ด้วย/CFM /AESV3พอร์ตมาจาก PDFlibPas และปรับเปลี่ยนให้อยู่ในรูปแบบ TBytes
Version 2.31.0
เพิ่ม (Added)
- หน่วยพื้นฐานรหัสบล็อก AES (FIPS 197) ในยูนิตใหม่
FPdfAes.pasซึ่งเป็นรหัสบล็อก AES-128 และ AES-256 แบบ Pure-Pascal ร่วมถึงตัวช่วยโหมด CBC และแบ็กเอนด์ CSPRNG ที่พอร์ตมาจาก HotPDF และทวนสอบความถูกต้องผ่านการทดสอบคำตอบที่ทราบล่วงหน้าตาม FIPS-197 ภาคผนวก C.2 / C.3 แล้ว ซึ่งนี่เป็นรากฐานการเข้ารหัสลับสำหรับสแต็กการเข้ารหัส PDF 2.0 - การเข้ารหัสแบบรับรองความถูกต้อง AES-GCM (NIST SP 800-38D) ในยูนิตใหม่
FPdfAesGcm.pasดำเนินการสร้างฟังก์ชัน GHASH (การคูณในฟิลด์ GF(2^128)) GCTR และโครงสร้าง AEAD ของ GCM บนฐานฟังก์ชันบล็อก AES โดยกรณีการทดสอบ GCM ของ NIST ลำดับที่ 1 และ 3 (AES-128) ตรงกับข้อความเข้ารหัสและแท็กอ้างอิงอย่างชัดเจน และกรณีทดสอบลำดับที่ 13 (AES-256) ทำงานได้ครบรอบ ทั้งนี้ GCM เป็นโหมด ISO/TS 32003 สำหรับ PDF 2.0 - การตรวจสอบความถูกต้องความสมบูรณ์ของ ClassMap และ ParentTree ระดับ PDF/A Level A (ISO 19005-1 §6.8.3) ตัวบ่งชี้
pvaiParentTreeMissingตั้งค่าสถานะสำหรับ StructTreeRoot ที่ไม่มีแผนผังตัวเลข /ParentTree และตัวบ่งชี้pvaiClassMapUnresolvedตั้งค่าสถานะการอ้างอิงคลาส /C ที่ไม่มีการเชื่อมโยงกับ /ClassMap
Version 2.30.0
เพิ่ม (Added)
- การแทรกไฟล์ที่เกี่ยวข้อง (Associate Files) (
InjectAssociateFiles/TPdf.SaveAsWithAssociateFiles, ISO 32000-2 §7.11.4) ยูนิตใหม่FPdfAssocFilesทำการเพิ่มอาร์เรย์/AFของการอ้างอิงข้อมูลจำเพาะไฟล์ไปยังแค็ตตาล็อกหรือพจนานุกรมหน้าใดๆ ซึ่งครอบคลุมค่า/AFRelationshipทั้งแปดค่าในตาราง 45 ของข้อกำหนด ISO 32000-2 อีกทั้งยังได้นำรูปแบบการอัปเดตแบบเพิ่มทีละส่วน (incremental-update) ที่ผ่านการพิสูจน์แล้วจากInjectPadesDssMarkersมาใช้ซ้ำ - รองรับข้อกำหนด PDF/X-6 (ISO 15930-9:2020) โดย
TPdfXConformanceเพิ่มการรองรับpxc6ซึ่งตัวแทรกและตัวตรวจสอบความถูกต้องได้นำมาเชื่อมโยงผ่านการระบุตัวตนpdfxid:GTS_PDFXVersionทั้งนี้ PDF/X-6 คือมาตรฐานที่ใช้ PDF 2.0 เป็นฐานเพื่อมาทดแทน PDF/X-4 สำหรับการแลกเปลี่ยนเอกสารที่สมบูรณ์ - มาตรฐาน PDF/A ห้ามใช้งานการดำเนินการ
/Thread(ช่องว่างของรายการอนุญาตตาม ISO 19005-1 §6.6.1) รายการของการดำเนินการที่ต้องห้ามในตอนนี้จึงครอบคลุมการทำงาน Thread ควบคู่ไปกับ Launch, ResetForm, ImportData, SetOCGState, SetState, GoTo3DView, Rendition และ Hide
แก้ไข (Fixed)
- ในตอนนี้ขั้นตอนการตรวจสอบความถูกต้องของ PDF/A-4e ได้รองรับการตรวจสอบโครงสร้างแท็ก MarkInfo และการตัดคำเช่นเดียวกับ Level A แล้ว แม้ว่าการดาวน์เกรดฝั่งเซฟในเวอร์ชัน v2.29.0 ได้ครอบคลุม
PdfAIsLevelEแต่เงื่อนไขตรวจสอบของValidatePdfAComplianceทั้งสามตำแหน่งกลับตรวจสอบเฉพาะPdfAIsLevelAเพียงอย่างเดียว ส่งผลให้เอกสาร PDF/A-4e ที่ขาดโครงสร้างแท็กผ่านการตรวจสอบไปอย่างเงียบๆ - ความคลาดเคลื่อนของการทดสอบ OCG
/BaseState: การผ่านกระบวนการ PostProcess ของ v2.28.0 ได้ขยายการยอมรับเป็น/ONหรือ/OFFอย่างถูกต้องแล้ว (ตาราง 8.70 ของข้อกำหนด ISO 32000-1) แต่การทดสอบของ Delphi และ C++ ยังคงคาดหวังให้ปฏิเสธค่า/OFFอยู่ ในปัจจุบันการทดสอบจึงเปลี่ยนไปใช้ค่าที่ไม่ถูกต้องจริงๆ (/Undefined) และมีการทดสอบเชิงบวกใหม่เพื่อล็อกการยอมรับสถานะ/OFF - การจับคู่ที่มากเกินไปของ Geospatial
/Subtype /GEO: ฟังก์ชันContainsDictionarySubtype('GEO')ตรวจสอบพบพจนานุกรมใดๆ ที่ถือโทเค็นดังกล่าว รวมถึงพจนานุกรมที่ไม่เกี่ยวข้องกัน เช่น รายการ/ViewerPreferences << /Subtype /GEO >>ที่ค้างอยู่ ในขณะนี้ ฟังก์ชันใหม่ContainsMeasureDictionarySubtypeมีข้อกำหนดเพิ่มเติมว่าต้องมีรายการ/Type /Measureหรือคีย์ข้างเคียงเฉพาะของ Measure ส่งผลให้พจนานุกรมที่ไม่ใช่ Measure จะไม่ทำให้เปิดทำงานข้อกำหนด ADBE ExtensionLevel 3 อีกต่อไป
Version 2.29.0
เพิ่ม (Added)
- รองรับมาตรฐาน PDF/A-4 (ISO 19005-4:2020) ในตัวตรวจสอบความถูกต้อง ตัวแทรก XMP และเลเยอร์ตัวแบบวัตถุ (object-model) ของ Pdfium โดย
TPdfAConformanceได้เพิ่มpac4base,pac4fและpac4eซึ่งระดับฐานอ้างอิงกับ PDF 2.0 (ISO 32000-2) และเข้าแทนที่ระดับ A/B/U แบบเดิมด้วยระดับฐาน + F (ฟอร์ม) + E (การเข้าถึง) ทั้งนี้ValidatePdfAจะอ่านแพ็กเก็ต XMP ของpdfaid:part=4(ระดับฐานจะไม่รวมองค์ประกอบความสอดคล้อง) เมธอดSaveAsPdfAจะส่งส่วนข้อมูลดังกล่าวออก และSignPadesWithPdfAจะยอมรับpac4baseเป็นคอนเทนเนอร์เก็บถาวรระยะยาว - การผูกอินเทอร์เฟซ
FPDFBookmark_GetColor— การส่งออกสาธารณะของ PDFium รายการสุดท้ายที่ยังไม่ได้ผูกอินเทอร์เฟซ (469/469) โดยTBookmarkได้เพิ่มฟิลด์HasColorและColorซึ่งดึงข้อมูลมาจากอาร์เรย์/Cของบุ๊กมาร์ก (ISO 32000-1 §12.3.3) ทั้งนี้การผูกใช้การโหลดแบบยอมรับความเสียหายเพื่อให้ DLL รุ่นเก่าที่สร้างขึ้นก่อนการส่งออกนี้ยังคงทำงานได้ - การตรวจสอบความถูกต้องเวอร์ชันของส่วนหัว PDF/E-1 (ISO 24517-1 §5)
pveiBadPdfVersion— เนื่องจาก PDF/E-1 อ้างอิงจาก PDF 1.6 ดังนั้นส่วนหัวที่ไม่ใช่ 1.6 จะถูกทำเครื่องหมายแจ้งเตือนในขณะนี้ - มาตรฐาน PDF/R-1 (ISO 23504-1)
pvriEncryptVersionMismatch— การเข้ารหัสได้รับอนุญาตเฉพาะกับส่วนหัว%PDF-2.0เท่านั้น โครงสร้างภายใน 1.x ที่มีรายการ/Encryptจะถูกทำเครื่องหมายแจ้งเตือนในขณะนี้ (ก่อนหน้านี้ไม่มีการดำเนินการใดๆ) - มาตรฐาน PDF/R-1
pvriBadMediaBox— ค่าMediaBoxของแต่ละหน้าต้องเป็น[0 0 w h]โดยPdfRHasNonZeroMediaBoxOriginเป็นตัวสแกน ASCII ที่ไม่ขึ้นกับภาษาท้องถิ่นซึ่งจะข้ามรายการ MediaBox ที่เป็นแบบอ้างอิงทางอ้อม - การตรวจสอบความถูกต้องระดับ PDF/A Level A สำหรับ
pvaiRoleMapUnresolved(ISO 19005-1 §6.8.3.4) — โครงสร้าง RoleMap ที่มีอยู่แต่ไม่สมบูรณ์ซึ่งละทิ้งประเภทโครงสร้าง/Sแบบกำหนดเองไว้โดยไม่จับคู่จะถูกทำเครื่องหมายแจ้งเตือนในขณะนี้ เพื่อปิดช่องโหว่ที่เหลือจากการตรวจสอบpvaiRoleMapMissingที่ทำหน้าที่เพียงแค่ตรวจสอบการมีอยู่เท่านั้น
แก้ไข (Fixed)
- ฟังก์ชัน
PdfVersionToName(20)คืนค่าเป็น"1.0"แทนการคืนค่า"2.0"ซึ่งส่งผลเสียต่อรายการ/Versionของแค็ตตาล็อกและข้อความของตัวตรวจสอบความถูกต้องสำหรับการบันทึก PDF 2.0 ทุกครั้ง โดยตัวจัดรูปแบบได้แยกส่วนเวอร์ชันหลัก (major) และเวอร์ชันรอง (minor) อย่างชัดเจนสำหรับรหัสเวอร์ชันที่มีค่า>= 20 - ตัวเข้ารหัสค่าลบ INTEGER ในไฟล์
FPdfAsn1.pasล้มเหลวในการคอมไพล์ภายใต้ Delphi 12 (ข้อผิดพลาดE2015ในส่วนของInteger(-(V<0))) ส่งผลให้โครงการทดสอบทั้งหมดหยุดชะงัก ซึ่งได้รับการแก้ไขแล้วโดยการใช้Int64(-Ord(V<0))สำหรับหน้ากากส่วนขยายเครื่องหมาย - รายการคำอธิบายประกอบที่ต้องห้ามของ PDF/A ในตอนนี้ครอบคลุม
/RichMediaในทุกส่วน (ซึ่งก่อนหน้านี้พลาดไป เนื่องจาก ISO 32000-1 §12.5.6.35 ห้ามการใช้งานนี้ใน PDF/A)
Version 2.28.0
เพิ่ม (Added)
TPdfVersionครอบคลุมpv20สำหรับ PDF 2.0 (ISO 32000-2) ในขณะนี้ โดยฟังก์ชันDecodePdfVersion(20)จะคืนค่าpv20แทนการคืนค่าpvUnknownและEncodePdfVersion(pv20)จะส่งค่า 20 ส่งผลให้เวอร์ชันของเอกสาร PDF 2.0 จะไม่สูญหายไปเมื่ออ่านข้อมูลย้อนกลับ และสามารถเขียนข้อมูลลงไปอย่างชัดเจนได้
เปลี่ยนแปลง (Changed)
DecodeDateแจงส่วนสตริงวันที่ของ PDF ที่อาจมีฟิลด์ต่อท้ายตามมาตรฐาน PDF Reference 3.8.3 แทนที่จะต้องการโครงสร้างD:YYYYMMDDHHmmSSOHH'mm'ความยาว 23 อักขระแบบเต็ม ในขณะนี้ข้อมูลวันที่ย่อที่เป็นไปตามข้อกำหนด เช่นD:20260712,D:20260712153000และD:20260712153000Zได้รับการยอมรับแล้ว ซึ่งแต่ก่อนนั้นจะถูกปฏิเสธเนื่องจากเงื่อนไขLength=23ที่เข้มงวด ทั้งนี้ค่าเบี่ยงเบนชั่วโมงของเขตเวลา (timezone hour offset) จะถูกตรวจสอบความถูกต้องโดยอิงจากช่วงที่มีอยู่จริงคือ UTC-12..UTC+14 แทนการตรวจสอบกับค่า> 23FPdfMeasure.MeasureTextทำการเข้ารหัสชื่อแบบอักษรเป็น FPCAnsiString/ DelphiUTF8Encodeเพื่อให้สอดคล้องกับจุดเรียกใช้งาน FPDF_BYTESTRING อื่นๆ ของไลบรารี แทนการแปลงค่าAnsiStringตรงๆ ซึ่งทำให้อักษรตระกูลฟอนต์ที่ไม่ใช่ ASCII เสียหายผ่านโค้ดเพจปัจจุบัน
แก้ไข (Fixed)
- กระบวนการจัดการค่าลบของ
TDerWriter.Integerทำงานล้มเหลวหรือสร้างข้อมูล DER ที่มีรูปแบบไม่ถูกต้อง: การทำงานของลูปwhile V <> -1 do V := V shr 8ทำให้ตัวแปรInnerว่างเปล่าสำหรับกรณีValue = -1(เกิดข้อผิดพลาดขอบเขตช่วงในคำสั่งInner[Length(Inner)-1]ถัดมา) และสร้างไบต์เกินมาสำหรับค่าลบอื่นๆ โดยในปัจจุบันตัวเข้ารหัสได้ดึงข้อมูลไบต์แบบส่วนเติมสอง (two's-complement) ด้วยการเลื่อนตำแหน่งแบบขยายเครื่องหมาย และหยุดทำงานอย่างถูกต้องเมื่อข้อมูลที่เหลือเป็นข้อมูลขยายเครื่องหมายทั้งหมด ทั้งนี้เนื่องจากฟิลด์ CMS/PAdES INTEGER เป็นค่าบวก การแก้ไขนี้จึงมีผลเฉพาะกับผู้เรียกใช้ที่ส่งค่าลบเข้ามาเท่านั้น แต่ในตอนนี้กระบวนการดังกล่าวทำงานได้อย่างถูกต้องแล้ว TPdf.GetCharacterOriginและTPdfView.GetCharacterOriginละเลยค่าส่งกลับของFPDFText_GetCharOriginและคืนค่าพิกัดที่ไม่มีการกำหนดค่าเริ่มต้นเมื่อเกิดความล้มเหลว ในปัจจุบันผลลัพธ์ได้รับการกำหนดค่าเริ่มต้นเป็นศูนย์แล้ว และการอ่านที่ล้มเหลวจะคืนค่าพิกัดเริ่มต้น (ตรงตามข้อตกลงของGetCharacterRectangle)
Version 2.27.0
เปลี่ยนแปลง (Changed)
- เดโม
PDFViewerและMultiPageViewerรองรับEnterและF3สำหรับผลลัพธ์ถัดไป รีเซ็ตบริบทเมื่อเปลี่ยนตัวเลือก และใช้Escเพื่อยกเลิกการค้นหาหรือการพิมพ์ - การพิมพ์ทำตามการหมุนปัจจุบันและเลือกแนวตั้งหรือแนวนอน
- เดโม
ViewerInteractionLabรองรับCtrl+A,Ctrl+C,Enter,F3และEsc
แก้ไข (Fixed)
- การยกเลิกการพิมพ์ใน C++Builder และ Lazarus หยุดงานเครื่องพิมพ์และออกจากลูปซ้อน
- ปุ่ม Cancel ของ
MultiPageViewerเชื่อมต่อกับตัวจัดการแล้ว
Version 2.26.0
เปลี่ยนแปลง (Changed)
TPdf.GetObjectBitmap,TPdf.GetBitmap,TPdf.GetThumbnailและคู่ของTPdfViewใช้ล็อกการเรนเดอร์รอบFPDFImageObj_GetBitmap/FPDFPage_GetThumbnailAsBitmapTPdf.RenderPageThumbnailเคารพ/Rotateและคำนวณใหม่สำหรับ/Rotate 90และ270
แก้ไข (Fixed)
TPdfView.GetCharacterRectangleตั้งค่าเป็นศูนย์เมื่อFPDFText_GetCharBoxล้มเหลวและคืนค่าRect(0,0,0,0)GetLinkAnnotationsใช้size-1สำหรับเส้นทาง URI และไฟล์
Version 2.25.0
เปลี่ยนแปลง (Changed)
TPdf.AddText,SetText,AddPathและInsertFormObjectFromXObjectทำให้หน้าข้อความแคชและคำอธิบายประกอบลิงก์ไม่ถูกต้องก่อนสร้างเนื้อหาใหม่TPdfView.RenderPage(HDC, ...)ใช้ล็อกการเรนเดอร์และปิดบังข้อยกเว้น FPU/SSE- เดโม
PrintPDFเรียกPrinter.Abortเมื่อยกเลิก
แก้ไข (Fixed)
TPdf.GetCharacterและGetCharcodeคืน U+FFFD สำหรับโค้ดพอยต์เหนือ U+FFFFGetWebLinksจำกัดค่าลบของFPDFLink_CountRectsเป็นศูนย์TPdf.Destroyล้างPasswordจากหน่วยความจำ
Version 2.24.0
เพิ่ม (Added)
TPdf.DeletePageและการทำงานกับไฟล์แนบตรวจสอบดัชนีและยกEPdfErrorเมื่อเกินช่วง
แก้ไข (Fixed)
- แฮนเดิลอ็อบเจ็กต์หน้าถูกทำลายเมื่อเกิดข้อยกเว้น
TPdf.UnloadPageทำลายแฮนเดิลFPathที่ถูกละทิ้งTPdf.InsertFormObjectFromXObjectเรียกUpdatePageหลังแทรก
Version 2.23.0
แก้ไข (Fixed)
- การตรวจสอบ
/BaseStateยอมรับ/OFFนอกเหนือจาก/ON - การตรวจสอบ
/Intentยอมรับ/Designและอาร์เรย์[/View /Design] - การตรวจจับ Measure เชิงภูมิศาสตร์รู้จัก
/Subtype /GEOโดยไม่ต้องมี/Type /Measure
Version 2.22.0
เปลี่ยนแปลง (Changed)
- การคำนวณซูมของ
TPdfViewใช้ClientWidth/ClientHeightแทนWidth/Heightเพื่อปรับหน้ากับพื้นที่มองเห็น AddSignatureTimestampToCmsยกExceptionสำหรับฟิลด์ CMS SignerInfo ที่อ่านไม่ได้
แก้ไข (Fixed)
- แฮนเดิลคีย์ส่วนตัว CNG ใน
ResolveWinSignerถูกปล่อยด้วยNCryptFreeObject EcDsaP1363ToDerปฏิเสธครึ่งrหรือsที่เป็นศูนย์ทั้งหมดและไม่สร้างINTEGER 0
Version 2.21.12
แก้ไขแล้ว (Fixed)
- การบันทึก PDF 1.5 ถึง PDF 1.7 อย่างชัดเจนจะปฏิเสธโครงสร้าง
/OCPropertiesของแคตาล็อกที่มีรูปแบบไม่ถูกต้อง รวมถึงรายการ/OCGsหรือ/Dที่จำเป็นที่หายไป ค่าการกำหนดค่าเริ่มต้นที่ไม่ถูกต้อง และรายการสถานะที่ไม่ใช่อาร์เรย์
Version 2.21.11
แก้ไขแล้ว (Fixed)
- การบันทึกเวอร์ชัน PDF อย่างชัดเจนจะปฏิเสธรายการ
/Annotsของหน้าโดยตรงหรือโดยอ้อมซึ่งพจนานุกรมคำอธิบายประกอบละเว้นรายการ/Subtypeหรือ/Rectที่จำเป็น
Version 2.21.10
แก้ไขแล้ว (Fixed)
- การบันทึก PDF 1.7 อย่างชัดเจนต้องการให้พจนานุกรมภูมิสารสนเทศ
/Type /Measure /Subtype /GEOและคำอธิบายประกอบ Projection ประกาศ/Extensions /ADBEด้วย/BaseVersion /1.7และ/ExtensionLevel 3หรือใหม่กว่า
Version 2.21.9
แก้ไขแล้ว (Fixed)
- การบันทึก PDF 1.7 อย่างชัดเจนต้องการให้คำอธิบายประกอบ RichMedia และการดำเนินการ
RichMediaExecuteประกาศ/Extensions /ADBEด้วย/BaseVersion /1.7และ/ExtensionLevel 3หรือใหม่กว่า
Version 2.21.8
แก้ไขแล้ว (Fixed)
- การบันทึก PDF 1.7 อย่างชัดเจนต้องการให้ stream PRC 3D ประกาศ
/Extensions /ADBEด้วย/BaseVersion /1.7และ/ExtensionLevel 1หรือใหม่กว่า แทนที่จะถือว่า PRC เป็นคุณสมบัติหลักของ PDF 1.7
Version 2.21.7
แก้ไขแล้ว (Fixed)
- การบันทึก PDF 1.4 และเก่ากว่าอย่างชัดเจนจะปฏิเสธรายการ
/SMaskInDataของ XObject รูปภาพ รวมถึงค่าที่ชัดเจน0เนื่องจากช่องทาง soft-mask JPEG 2000 ที่ฝังอยู่ต้องการ PDF 1.5 หรือใหม่กว่า
Version 2.21.6
แก้ไขแล้ว (Fixed)
- การบันทึก PDF 1.4 และเก่ากว่าอย่างชัดเจนจะปฏิเสธ XObject รูปภาพ 16 บิตที่ต้องการ PDF 1.5 หรือใหม่กว่า ขณะที่เป้าหมาย PDF 1.5 ถึง PDF 1.7 จะคงข้อมูลภาพ
/BitsPerComponent 16ไว้
Version 2.21.5
แก้ไขแล้ว (Fixed)
- การบันทึก PDF 1.4 และเก่ากว่าอย่างชัดเจนจะปฏิเสธค่า
/PageLayout /TwoPageLeftและ/TwoPageRightของแคตาล็อกเอกสารที่ต้องการ PDF 1.5 หรือใหม่กว่า ขณะที่เป้าหมาย PDF 1.5 ถึง PDF 1.7 จะคงเลย์เอาต์สองหน้าที่ร้องขอไว้
Version 2.21.4
แก้ไขแล้ว (Fixed)
- การบันทึก PDF 1.3 อย่างชัดเจนจะปฏิเสธรายการ
/Langในแคตาล็อกเอกสารที่ต้องการ PDF 1.4 หรือใหม่กว่า ขณะที่เป้าหมาย PDF 1.4 ถึง PDF 1.7 จะคงตัวระบุภาษาไว้
Version 2.21.3
แก้ไขแล้ว (Fixed)
- การบันทึก PDF 1.3 อย่างชัดเจนจะปฏิเสธต้นไม้ชื่อ
/EmbeddedFilesของสนธิสัญญาที่ต้องการ PDF 1.4 หรือใหม่กว่า โดยไม่ปฏิเสธสตรีมไฟล์ที่อ้างอิงผ่านข้อมูลไฟล์รุ่นเก่า
Version 2.21.2
แก้ไขแล้ว (Fixed)
- เวอร์ชันล่าสุด: 2.21.2; วันที่สร้าง:
Version 2.21.1
แก้ไขแล้ว (Fixed)
- การตรวจสอบการอ้างอิงแบบไฮบริดจะใช้รายการ
/XRefStmเสริมก่อนตัวแทนที่ xref แบบคลาสสิกจากการแก้ไขเดียวกัน ทำให้ออปเจกต์ที่ถูกบีบอัดและออปเจกต์อื่น ๆ ที่จำกัดเวอร์ชันไม่ถูกลายอีกต่อไป
Version 2.21.0
เปลี่ยนแปลง (Changed)
- ตัวอย่างการดูทั้งหมดของ Delphi, C++Builder และ Lazarus สามารถเปิด PDF ที่ส่งผ่านเป็นอาร์กิวเมนต์แรกของบรรทัดคำสั่ง และตัวอย่าง
MultiPageViewerของ C++Builder และ Lazarus มีทางลัดแบบชัดเจนสำหรับเลือกทั้งหมดและคัดลอก
แก้ไขแล้ว (Fixed)
- เวอร์ชันล่าสุด: 2.21.3; วันที่สร้าง:
Version 2.20.0
เปลี่ยนแปลง (Changed)
- ตัวอย่างการดูทั้งหมดของ Delphi, C++Builder และ Lazarus มีทางลัดแบบสอดคล้องกันสำหรับการเปิด ค้นหา บันทึก พิมพ์ ย่อ/ขยาย และการนำทางหน้า ขณะที่ตัวอย่าง
ViewerInteractionLabแต่ละตัวยังรองรับการกระโดดหน้า การย่อ/ขยายแบบเพิ่มเติม 10–600 % บันทึกการโต้ตอบถาวร และการตรวจสอบตำแหน่งคลิกแบบไปกลับ
Version 2.19.1
แก้ไขแล้ว (Fixed)
- เวอร์ชันล่าสุด: 2.21.4; วันที่สร้าง:
Version 2.19.0
เปลี่ยนแปลง (Changed)
- เวอร์ชันล่าสุด: 2.21.12; วันที่สร้าง:
แก้ไขแล้ว (Fixed)
CJKTextLabของ C++Builder ในตอนนี้วัดข้อความผ่านฟังก์ชันการแก้ไข PDFium ที่ export ออกมา และMergePDFหลีกเลี่ยงการ overload ข้อความ VCL ที่คลุมเครือ ซึ่งช่วยคืนค่าการสร้างที่สะอาดใน RAD Studio 37
Version 2.18.3
แก้ไขแล้ว (Fixed)
- PAdES B-LTA Document Time-stamp ในตอนนี้ถูกลงทะเบียนเป็นฟิลด์ลายเซ็นที่ค้นพบได้ — Widget ที่มองไม่เห็นซึ่งเข้าถึงได้ผ่าน
/Annotsของหน้าแรกและ/Fieldsของ AcroForm (ETSI EN 319 142-1 §5.4.3) — แทนที่จะเป็น orphan object ที่เข้าไม่ถึงซึ่ง validators ที่ enumerate signature-field ไม่สามารถค้นหาได้ โดยคำอธิบายประกอบและฟิลด์ที่มีอยู่จะยังคงไว้
Version 2.18.2
แก้ไขแล้ว (Fixed)
- การลงนาม PAdES และการเขียน cross-reference แบบ classic ในตอนนี้จะ raise ข้อผิดพลาดที่ชัดเจนเมื่อ byte offset เกินขนาดฟิลด์ที่กำหนดไว้แบบ 10 หลัก (~9.3 GB) แทนที่จะปล่อยให้ placeholder
/ByteRangeถูกเขียนอย่างเงียบๆ (ซึ่งทำให้ลายเซ็นไม่ถูกต้อง) หรือทำให้ xref line ขนาด 20 ไบต์ล้นออก (ISO 32000-1 §7.5.4) โดยเอาต์พุตของ cross-reference-stream จะใช้ฟิลด์ไบนารีขนาด 8 ไบต์และไม่ได้รับผลกระทบ
Version 2.18.1
แก้ไขแล้ว (Fixed)
- การลงนาม PAdES ในตอนนี้แก้ไข indirect references ของ
/Annots,/AcroFormและ/Fieldsของหน้าแรกโดยใช้ object header ทั้งหมด (ISO 32000-1 §7.5.3) และหมายเลข generation จริงของ reference นั้นๆ โดยการค้นหาด้วย substring ก่อนหน้านี้จะตรงกับหมายเลขออบเจกต์ภายในที่ยาวกว่า (แก้ไข5 0 Rเป็น15 0 obj) และ generation ที่ hard-code ไว้จะพลาดgen>0objects ทำให้ signature field arrays เสียหายหรือปฏิเสธเอกสารที่ถูกต้อง - เมื่อ catalog, หน้าแรก,
/Annots,/AcroFormหรือ/Fieldsอยู่ใน object stream การลงนามในตอนนี้จะลองอีกครั้งบน expanded copy ก่อนที่จะ fail แทนที่จะปฏิเสธเอกสารทันที
Version 2.18.0
เพิ่มเติม (Added)
ReadPdfVersionInfoรายงานเวอร์ชัน header, เวอร์ชัน core ที่มีผล, การแทนที่ catalog และระดับ Adobe developer extension จาก PDF stream
เปลี่ยนแปลง (Changed)
- การบันทึกแบบ PDF 1.3-1.7 ชัดเจนในตอนนี้จะตรวจสอบโครงสร้าง catalog, page-resource, XFA, redaction และ developer-extension ใน owning object context ของมัน โดย output เวอร์ชันชัดเจนที่เข้ารหัสและ PDF 1.3 incremental normalization จะถูกปฏิเสธเพื่อรักษาความสมบูรณ์ของเอกสาร
- การบันทึกผ่าน file-path ในตอนนี้จะเขียนไปยัง sibling temporary file และแทนที่ destination เฉพาะเมื่อการบีบอัด normalization และการตรวจสอบเวอร์ชันทั้งหมดสำเร็จ
แก้ไขแล้ว (Fixed)
- เอาต์พุต PDF 1.3 ในตอนนี้มี
/ProcSetresource ที่ครบถ้วนตามที่กำหนดและลบ transparency keys ของ PDF 1.4 ออกเมื่อมันเพียงแค่ทำซ้ำค่าเริ่มต้นของ graphics-state ของ PDF 1.3 - ไฟล์ hybrid-reference, xref-stream และ object-stream ไม่ถูก rewrite โดย classic-xref compressor อีกต่อไป ป้องกันไม่ให้ entries ของ compressed-object ถูกทิ้ง
- ชื่อที่คล้ายกับ transparency หรือ catalog feature keys ใน strings, comments หรือ resource maps ที่ไม่เกี่ยวข้องไม่ทำให้เกิดความล้มเหลว target-version ที่ผิดพลาดอีกต่อไป
Version 2.17.0
เพิ่มเติม (Added)
- ลายเซ็น PAdES ในตอนนี้ถูกลงทะเบียนเป็น Widget annotations ที่มองไม่เห็นใน
/Annotsarray ของหน้าแรกและใน/Fieldsarray ของ AcroForm โดยยังคงคำอธิบายประกอบและฟิลด์ฟอร์มที่มีอยู่
เปลี่ยนแปลง (Changed)
- การอัปเดตแบบ incremental ของ PDF/A, PDF/X, PDF/E, PDF/R, PDF/UA, PDF/VT และ PAdES ในตอนนี้จะรักษาการแสดง cross-reference ของเอกสารต้นฉบับ: เอกสาร xref-stream จะได้รับการอัปเดต xref-stream ตามที่ ISO 32000-1 §7.5.8.1 กำหนด ในขณะที่เอกสาร classic ยังคงได้รับ xref table
- Cross-reference offsets,
startxref,/Prev, ค่า PAdES ByteRange และการประมวลผล SHA-256 range ในตอนนี้ใช้ตำแหน่ง 64-bit พร้อม chunked hashing ซึ่งช่วยให้ไฟล์ที่ใหญ่กว่า 2 GB ทำงานได้ในบิลด์แบบ 64-bit - XMP packets ที่สร้างขึ้นซึ่งเขียนได้ในตอนนี้จะสำรอง 2048 ไบต์ของการ padding ก่อน packet instruction ปิด
Version 2.16.10
แก้ไขแล้ว (Fixed)
- การขยาย object-stream ไม่ฟื้นคืนสำเนา stale ของออบเจกต์ที่ incremental update ย้ายออกจาก object stream ไปเป็น plain definition (ISO 32000-1 §7.5.7) อีกต่อไป โดยการตรวจสอบ conformance และการ inject marker ก่อนหน้านี้จะแก้ไข catalog หรือ metadata dictionary ที่ล้าสมัยในไฟล์ดังกล่าว
Version 2.16.9
แก้ไขแล้ว (Fixed)
- บน Free Pascal, text strings ที่ input ไม่ใช่ UTF-8 ที่ถูกต้องจะถูกขยายทีละไบต์เป็น Latin-1 และเขียนเป็น UTF-16BE hex strings โดย high bytes ดิบก่อนหน้านี้รั่วไหลเข้าไปใน literal string ซึ่งไม่ใช่ text-string encoding ที่ถูกต้องตาม PDF 1.7
- Stream decoding ในตอนนี้รู้จัก raw deflate data โดยไม่มี RFC 1950 zlib wrapper (ข้อบกพร่องทั่วไปของ broken writers) และ decompress ในโหมด raw ดังนั้น conformance scans จึงไม่ตกหล่น stream ดังกล่าวอีกต่อไป
Version 2.16.8
แก้ไขแล้ว (Fixed)
- Incremental updates ที่เขียนโดย save post-processing path ในตอนนี้จะรีเฟรช element ที่สอง (changing) ของ trailer
/IDตามที่ ISO 32000-1 §14.4 กำหนด โดยทั้งสอง elements ก่อนหน้านี้ถูกคัดลอกตรงๆ ดังนั้น caching และ synchronisation tools จึงเห็น identifier ที่ไม่เปลี่ยนแปลงหลังจากทุกการอัปเดต
Version 2.16.7
แก้ไขแล้ว (Fixed)
- การ blanking ของ stream-body ที่ใช้โดย conformance scans ในตอนนี้กำหนดให้ keyword
streamต้องตามด้วย end-of-line (ISO 32000-1 §7.3.8.1) โดยคำว่า stream ภายใน literal string เช่น(downstream)ก่อนหน้านี้จะ blank โครงสร้างที่ตามมาทั้งหมดจนถึงendstreamถัดไป ซึ่งซ่อนการละเมิดจริงจาก byte-level checks - การสแกน forbidden-feature ของ PDF/X และ PDF/E นอกจากนี้ยังทำให้ literal strings และ comments (§7.2.2) ว่างเปล่า ดังนั้นค่าเช่น
/Title (see /JavaScript docs)หรือ commented token จึงไม่สร้าง finding แบบผิดพลาดสำหรับJavaScript,AcroFormหรือLZWDecodeอีกต่อไป
Version 2.16.6
แก้ไขแล้ว (Fixed)
- PDF/VT DPM entries ในตอนนี้ถูกตรวจสอบความถูกต้องเมื่อเขียนตามที่ document: ชื่อ key ที่ละเมิดกฎ ISO 16612-2 §6.6 NMTOKEN หรือกฎ Annex E registrant-prefix และชื่อที่ซ้ำกันจะถูกปฏิเสธแทนที่จะถูกเขียนลงใน DPart dictionary — ชื่อที่มีช่องว่างก่อนหน้านี้จะแยกออกเป็น key/value pair ที่ bogus และทำให้ dictionary เสียหาย
Version 2.16.5
แก้ไขแล้ว (Fixed)
- การลบ dictionary entry ที่ค่าเป็น hex string (เช่น
/Check <...>) ในตอนนี้จะลบทั้ง entry โดย injectors ก่อนหน้านี้จะทิ้ง orphan hex value ไว้ ทำให้เกิด dictionary ที่มีไวยากรณ์เสียหาย - การลบ entry ที่ indirect reference ใช้ newlines ระหว่าง tokens (ISO 32000-1 §7.3.10 อนุญาต whitespace ใดก็ได้) ไม่ทิ้ง generation number และ
Rkeyword ไว้อีกต่อไป
Version 2.16.4
แก้ไขแล้ว (Fixed)
- การสแกน maximum-object-number ไม่กำหนดให้ object headers ต้องเริ่มต้นที่บรรทัด (ISO 32000-1 §7.5.3 อนุญาต whitespace หรือ delimiter ใดก็ได้ก่อนหน้า) ดังนั้น injectors จึงไม่สามารถ allocate หมายเลขออบเจกต์ที่ชนกับ inline
N G objheader และทำให้ไฟล์เสียหายอย่างเงียบๆ ได้อีกต่อไป โดยหมายเลขออบเจกต์ถูกจำกัดด้วย Annex C ceiling - Streams ที่
/Lengthเป็น indirect reference ในตอนนี้จะ resolve ออบเจกต์ integer ที่อ้างอิงและใช้ค่าของมันเมื่อตรงกับendstreamที่ปิด โดยก่อนหน้านี้ streams ดังกล่าวถูกจำกัดด้วยการค้นหา pattern ซึ่งตัด bodies ที่มี byte sequenceendstreamอยู่โดยถูกกฎหมาย — ซึ่งเป็นเรื่องปกติสำหรับ embedded PDF attachments
Version 2.16.3
แก้ไขแล้ว (Fixed)
- Stream compression ส่ง cross-reference-stream documents (ไฟล์ PDF 1.5+ ที่ไม่มี classic
trailerkeyword) ผ่านโดยไม่เปลี่ยนแปลง โดย rebuild path ก่อนหน้านี้จะ misparsestartxrefเป็น table location และสังเคราะห์ trailer ที่เดา ซึ่งอาจทำให้ไฟล์ที่เปิดไม่ได้ถูกสร้างขึ้น - Compressor ข้าม XMP metadata streams เพื่อให้เอกสาร PDF/A คง metadata stream แบบไม่กรองที่บังคับ (ISO 19005-1 §6.7.2) และปล่อย external file streams (
/Fพร้อม/FFilter) ไว้โดยไม่แตะต้อง - Rebuilt cross-reference table สแกน stream-stripped copy ของเอกสาร ดังนั้น binary stream content ไม่สามารถ fake object headers หรือทำให้ table ขยายได้อีกต่อไป โดย
/Sizeของ rebuilt trailer ในตอนนี้สะท้อน table จริงและหมายเลขออบเจกต์ถูก cap ที่ Annex C ceiling - การหา original cross-reference table ยอมรับการขึ้นบรรทัดแบบ CR-only (ISO 32000-1 §7.5.1) และไม่สามารถ match ตัวอักษร
xrefภายในstartxrefได้อีกต่อไป โดยการสแกน stream keyword ได้รับการป้องกันendstream-tail เดียวกันที่ใช้ที่อื่นและในตอนนี้จะเดินหน้าผ่าน stream bodies ที่ข้ามไป
Version 2.16.2
แก้ไขแล้ว (Fixed)
- การ parse integer ใน byte-level PDF readers ในตอนนี้ยอมรับเครื่องหมาย
+ที่ชัดเจนที่ ISO 32000-1 §7.3.3 อนุญาต และปฏิเสธ digit runs ที่จะ overflow ดังนั้น hostile หรือ corrupt documents จึงไม่สามารถ wrap lengths และ offsets ที่ parse ได้เป็นค่าที่ทำให้เข้าใจผิดอีกต่อไป
Version 2.16.1
แก้ไขแล้ว (Fixed)
- PDF/UA injector เขียนค่า catalog
/Langเป็น PDF text string ที่เหมาะสม โดยก่อนหน้านี้มันรัน value ผ่าน XML escaper ดังนั้น language tag ที่มี&หรือวงเล็บจึงสร้าง entry ที่เสียหาย และ non-ASCII input ถูกเขียนเป็น raw UTF-8 - PDF/E
/ISO_PDFEVersionInfo entry ใช้ shared text-string encoder เพื่อให้ non-ASCII values ถูกกฎหมายใน PDF 1.7 - XML escaping สำหรับ XMP packets จะทิ้ง control characters ที่ไม่ถูกกฎหมายใน XML 1.0 ดังนั้น metadata ที่คัดลอกมาจากเอกสาร source ที่เสียหายไม่สามารถ render metadata stream ทั้งหมดเป็น non-well-formed ได้อีกต่อไป
- PDF-to-XMP date conversion ตรวจสอบว่า date fields เป็นตัวเลขและ pad ช่อง minute ที่หายไป ป้องกันวันที่ ISO 8601 ที่ malformed ใน XMP ที่สร้างขึ้น บน non-Windows platforms fallback timestamp ในตอนนี้มีเวลาในวันนั้นแทนที่จะเป็นแค่วันที่เปล่าๆ
Version 2.16.0
เพิ่มเติม (Added)
- Stream decoding ในตอนนี้ reconstruct
/DecodeParmspredictors (PNG predictors 10-15 และ TIFF predictor 2, ISO 32000-1 §7.4.4.4) หลัง FlateDecode โดย honour/Colors,/BitsPerComponentและ/Columnsโดย object streams ที่บีบอัดด้วย predictor — ซึ่งเป็นตัวเลือกทั่วไปของ PDF 1.5+ writer — ก่อนหน้านี้แสดง differenced bytes ดังนั้น objects ที่มันบรรจุจึงมองไม่เห็นอย่างเงียบๆ ต่อ conformance scans และ marker injection
แก้ไขแล้ว (Fixed)
- การตรวจจับ FlateDecode ในตอนนี้ parse ค่า
/Filterเป็น name หรือ array แทนที่จะเป็นการจับคู่ substring ดังนั้น cascaded filter chains และการปรากฏตัวของคำในค่าที่ไม่เกี่ยวข้องจึงไม่ trigger inflate แบบ bogus อีกต่อไป chains ที่ไม่รองรับจะ fall back เป็น raw bytes เหมือนเดิม
Version 2.15.1
แก้ไขแล้ว (Fixed)
- Dictionary scanner ในตอนนี้ข้าม literal strings, hex strings และ comments ขณะที่ balance
<</>>(ISO 32000-1 §7.2.2) ดังนั้น dictionaries ที่มีค่าเช่น(A >> B)หรือ hex string ที่อยู่ติดกับ closing delimiter จึงไม่ถูกตัดทอนระหว่าง trailer, catalog และ conformance-scan parsing อีกต่อไป - Literal string extraction ในตอนนี้ decode ชุด escape §7.3.4.2 Table 3 ทั้งหมด —
\n \r \t \b \f, octal\ddd, line continuations และ unescaped EOL normalisation — แทนที่จะคัดลอก escape letter ตรงๆ ซึ่งคืนค่าการเปรียบเทียบ/Producer,/GTS_PDFXVersionและ/ISO_PDFEVersionที่ถูกต้องสำหรับ writers ที่ใช้ octal escapes - Literal strings ที่เขียนโดย marker injectors ในตอนนี้ escape CR, LF และ control characters อื่นๆ เพื่อให้ values รอดพ้นจาก reader-side end-of-line normalisation แบบ byte-for-byte
Version 2.15.0
แก้ไขแล้ว (Fixed)
- Incremental updates ที่เขียนโดย PDF/A, PDF/X, PDF/E, PDF/R, PDF/UA และ PDF/VT marker injectors และโดย PAdES signing และ DSS paths ในตอนนี้จะรักษา permanent file identifier ของเอกสาร source: element แรกของ trailer
/IDจะถูก carry over แบบ verbatim ตามที่ ISO 32000-1 §14.4 กำหนดและเฉพาะ element ที่สอง (changing) เท่านั้นที่ถูกรีเฟรช โดยก่อนหน้านี้ทั้งสอง elements ถูก regenerate ดังนั้น external references และ long-term-validation workflows จึงเห็น document identity ที่แตกต่างกันหลังจากทุกการบันทึก - ลายเซ็น PAdES, DSS injection และ B-LTA Document Time-stamps ในตอนนี้ carry reference
/Infoของ source trailer ไปข้างหน้า (ISO 32000-1 §7.5.6) ดังนั้น document properties จึงไม่หายไปจากแผง reader หลังจากการลงนาม โดย Document Time-stamp trailer ยังได้รับ/IDarray ด้วย - Fallback
/Infoของ trailer สำหรับ cross-reference-stream documents ในตอนนี้หา XRef stream dictionary อย่างถูกต้องและรักษา generation number ของ reference ก่อนหน้านี้มันไม่เคย match บนไฟล์ PDF 1.5+ ที่สอดคล้อง ทิ้ง/Infoอย่างเงียบๆ
Version 2.14.4
แก้ไขแล้ว (Fixed)
- Date
/Mของ signature dictionary ที่เขียนโดยTPdf.SignPadesและSignPadesBytesในตอนนี้มี prefixD:ที่บังคับและ UTC offset markerZที่ ISO 32000-1 §7.9.4 กำหนด โดย strict validators ก่อนหน้านี้จะปฏิเสธเวลาการลงนามว่าเป็น date string ที่ malformed
Version 2.14.3
แก้ไขแล้ว (Fixed)
- Dictionary key lookups ใน shared PDF reader ในตอนนี้จับคู่ whole name tokens (ISO 32000-1 §7.3.5) โดยก่อนหน้านี้ stream ที่ dictionary ระบุ
/Length1ก่อน/Length(ซึ่งเป็นเรื่องปกติสำหรับ FontFile streams) ถูกตัดทอนเป็น byte count ที่ผิด ทำให้ conformance scans ของ PDF/A, PDF/UA และอื่นๆ ที่อ่าน font, CMap หรือ metadata streams ตาบอดอย่างเงียบๆ - Trailer lookups ของ
/Encrypt,/Root,/Sizeและ/Infoไม่จับคู่ keys ที่ยาวกว่าซึ่งแชร์ prefix เดียวกัน (เช่น/EncryptMetadata) อีกต่อไป - Object-stream expansion ไม่เชื่อถือค่า
/Nที่ corrupt หรือ hostile อีกต่อไป: ค่าที่ไม่ใช่ integer ในตอนนี้ให้ผล 0 แทนที่จะเป็นตัวเลขที่ไม่ได้กำหนดค่า และ upper bound ที่ derive จาก/Firstป้องกันการ allocate ที่ oversized ขณะสแกนเอกสารที่ malformed
Version 2.14.2
แก้ไขแล้ว (Fixed)
- Marker injectors ของ PDF/X, PDF/VT, PDF/UA, PDF/E และ PDF/R ในตอนนี้คัดลอก encrypted source documents ผ่านโดยไม่เปลี่ยนแปลงแทนที่จะ append plaintext update sections โดยพฤติกรรมก่อนหน้านี้ทำให้ไฟล์ที่ trailer ล่าสุดสูญเสีย entry
/Encrypt(ISO 32000-1 §7.5.6) ดังนั้น conforming readers จึง misread encrypted body เป็น plaintext TPdf.SignPades,SignPadesBytesและInjectPadesDssMarkersในตอนนี้ raiseEPadesCryptoเมื่อเอกสาร source ถูกเข้ารหัส แทนที่จะ emit ไฟล์ที่เสียหายหรือตรวจสอบไม่ได้อย่างเงียบๆ โดยต้องลบการเข้ารหัสก่อนการลงนามหรือการ embed DSS material
Version 2.14.1
แก้ไขแล้ว (Fixed)
TPdf.SignPadesและSignPadesBytesในตอนนี้ back-fill ฟิลด์/ByteRangeทั้งสี่ของ signature dictionary โดยก่อนหน้านี้ สามฟิลด์สุดท้ายยังคงอยู่ที่ zero placeholders ดังนั้น signatures ที่ผลิตออกมาจึงประกาศ byte range ว่างเปล่าและล้มเหลวในการตรวจสอบใน conforming validators- PAdES B-LTA Document Time-stamp dictionaries ได้รับการแก้ไข back-fill
/ByteRangeเดียวกัน ValidatePadesComplianceในตอนนี้ยอมรับ signature layout มาตรฐานที่ byte range gap บรรจุค่า hex/Contentsและตรวจสอบว่า segment ช่วงที่สองสิ้นสุดที่ end of file พอดี โดยก่อนหน้านี้เฉพาะ gapless ranges เท่านั้นที่ผ่านการตรวจสอบ coverage
Version 2.14.0
เพิ่มเติม (Added)
TPdf.ExportXFDFserialize ค่า form field ทุกค่าและ annotation ในทุกหน้าเป็นเอกสาร XFDF (ISO 19444-1) โดย emit<fields>สำหรับ hierarchical form values และ<annots>สำหรับ annotation subtypes ที่รองรับทั้งหมด (text, highlight, underline, strikeout, squiggly, line, circle, square, caret, polygon, polyline, stamp, ink, freetext, fileattachment, sound, link, redact)TPdf.ImportXFDFอ่านเอกสาร XFDF กลับเข้าไปใน PDF ที่โหลดไว้ โดย re-create annotations บนหน้าที่ตรงกันและ apply ค่า field ไปยัง widget annotations ของมัน- Record
TPdfAnnotationได้รับName(NM),Subject,ModificationDate(M),CreationDate,Icon,Opacity(CA), line endpoints, polygon/polyline vertices และ ink-list gesture fields เพื่อให้ XFDF round-trips รักษา annotation metadata ทั้งหมด - ตัวอย่าง
XfdfLabใหม่ใน demo sets ของ Delphi, C++Builder และ Lazarus แสดงให้เห็น export/import round-trip
Version 2.13.6
แก้ไขแล้ว (Fixed)
ValidatePdfAในตอนนี้ treat catalog/Metadatastreams ที่ไม่มี/Type /Metadataหรือ/Subtype /XMLว่าเป็น XMP metadata ที่หายไปผ่านpvaiMissingXmpMetadata- PDF/A preflight reports ในตอนนี้จำแนก
pvaiMissingXmpMetadataเป็น Metadata และแนะนำ catalog/Metadatastream พร้อม/Type /Metadata,/Subtype /XML, unfiltered XMP และpdfaidmarkers
Version 2.13.5
แก้ไขแล้ว (Fixed)
ValidatePdfAในตอนนี้รายงาน Widget annotations ที่ไม่มี appearance dictionary และ PDF/A-2 / PDF/A-3 annotations ที่กำหนดให้มีแต่ขาด/APผ่านpvaiAnnotationApDictViolation- PDF/A preflight reports ในตอนนี้จัดหมวดหมู่
pvaiAnnotationApDictViolationเป็นเนื้อหาที่ marker injection ไม่สามารถซ่อมแซมได้
Version 2.13.4
แก้ไขแล้ว (Fixed)
ValidatePdfAในตอนนี้รายงาน PDF/A-2 และ PDF/A-3 inline images ที่ค่า/Iหรือ/Interpolateเป็นtrueผ่านpvaiImageDictionaryViolationซึ่งตรงกับ Image XObject dictionary coverage ที่มีอยู่- PDF/A preflight reports ในตอนนี้จัดหมวดหมู่
pvaiImageDictionaryViolationเป็นเนื้อหาที่ marker injection ไม่สามารถซ่อมแซมได้
Version 2.13.3
แก้ไขแล้ว (Fixed)
ValidatePdfAในตอนนี้รายงาน PDF/A-1 inline images ที่ใช้/LZWDecodeหรือ abbreviated/LZWfilters ภายใน content streams ผ่านpvaiInlineImageLzwForbiddenซึ่งตรงกับ PDF/A-2 และ PDF/A-3 inline-image coverage ที่มีอยู่- Inline-image filter scanner ในตอนนี้เดินหน้าผ่าน resource names นำหน้าเช่น
/GS1เพื่อหลีกเลี่ยงการหยุดชะงักขณะสแกน PDF/A-1 content streams ที่กว้างขึ้น
Version 2.13.2
เพิ่มเติม (Added)
TPdf.SetFocusedFormFieldTextเขียนข้อความลงใน edit buffer ของ form field ที่ focused อยู่ในปัจจุบันผ่านFORM_ReplaceSelectionซึ่ง symmetric กับFocusedFormFieldTextสำหรับ AcroForm text/combo fields ค่าจะ commit ไปยัง/Vเมื่อ focus หาย และคงอยู่ สำหรับ XFA text fields การเขียนจะอยู่ใน in-memory buffer เท่านั้น (PDFium ไม่มี public API สำหรับ reconcile XFA values กลับไปยัง datasets packet ดังนั้นจึงไม่คงอยู่ข้ามการบันทึก)- JavaScript host platform ในตอนนี้ถูก attach ทุกครั้งที่ V8 engine พร้อมใช้งาน ไม่ว่าเอกสารจะเป็น XFA หรือไม่ก็ตาม ดังนั้น embedded AcroForm JavaScript (doc-level scripts, field calculations,
app.alert) จึงสามารถ execute ได้ด้วย ก่อนหน้านี้m_pJsPlatformถูก wire เฉพาะสำหรับเอกสาร XFA เท่านั้น ทำให้ AcroForm JS ถูกปิดใช้งานอย่างเงียบๆ
เปลี่ยนแปลง (Changed)
- JavaScript platform attachment ในตอนนี้เป็นอิสระจาก XFA decision ใน
InitializeFormFill— ตารางm_pJsPlatformถูกสร้างทุกครั้งที่V8FeaturesAvailableเป็น true ซึ่ง apply หลังจาก XFA version/callback wiring แทนที่จะ nested อยู่ภายใน
Version 2.13.1
เพิ่มเติม (Added)
- Host events ใหม่ surface ข้อมูลที่ form-fill callbacks ของ v2.13.0 ก่อนหน้านี้กลืน:
OnXfaUriAction,OnXfaPageCountChanged,OnXfaFocusChange,OnXfaEmail,OnXfaHttpRequest,OnXfaOpenFile,OnJavaScriptBeep,OnJavaScriptPrint,OnJavaScriptMail,OnJavaScriptSubmitFormทุก event จะ default เป็น no-op behavior ที่มีอยู่เมื่อไม่ได้ assign ดังนั้น hosts ที่มีอยู่จึงไม่ได้รับผลกระทบ - Property read-only
TPdf.XfaFormPacketsคืนค่า one-shot snapshot ของ XFA packets ทั้งหมด (TXfaPacketList) ซึ่ง fulfill typesTXfaPacket/TXfaPacketListที่ประกาศไว้ก่อนหน้านี้แต่ไม่ได้ใช้ - XFA-specific PDFium error codes
FPDF_ERR_XFALOAD/FPDF_ERR_XFALAYOUTในตอนนี้ถูก bind และแสดงผ่านLastPdfErrorแทนที่ข้อความ "Unknown error" ทั่วไปสำหรับ XFA load/layout failures
เปลี่ยนแปลง (Changed)
FFI_DoURIActionWithKeyboardModifierในตอนนี้ consultOnXfaUriActionก่อน shell-execute URI จาก XFA field ทำให้ host มีสิทธิ์ veto (ความปลอดภัย: XFA field ที่เป็นอันตรายก่อนหน้านี้สามารถ launch URLs ที่ arbitrary ได้โดยไม่มีเงื่อนไข) Handlers ที่ไม่ได้ assign จะรักษาShellExecuteWdefault ก่อนหน้านี้DecodeFormFieldTypeในตอนนี้ route XFA field types ผ่านIsXfaFormFieldแทนที่จะเป็น explicit 8-branch case เพื่อให้ enum aligned กับFPDF_FORMFIELD_XFA_*โดย ordinal offset
แก้ไขแล้ว (Fixed)
ValidatePdfAในตอนนี้รายงาน PDF/A-1 claims ที่ใช้ PDF 1.5 cross-reference streams หรือ object streams ด้วย issue ใหม่pvaiPdfA1Pdf15Structureในขณะที่ยังคง allow object streams สำหรับ PDF/A-2 และ PDF/A-3
Version 2.13.0
เพิ่มเติม (Added)
- รองรับ XFA (XML Forms Architecture) runtime แบบเต็ม:
TPdf.InitializeFormFillในตอนนี้ wire callbacks version-2FPDF_FORMFILLINFOทั้ง 14 ตัว (FFI_DisplayCaret,FFI_GotoURL,FFI_PageEvent,FFI_PopupMenu,FFI_OpenFile,FFI_EmailTo,FFI_UploadTo,FFI_GetPlatform,FFI_GetLanguage,FFI_DownloadFromURL,FFI_PostRequestURL,FFI_PutRequestURL,FFI_OnFocusChange,FFI_DoURIActionWithKeyboardModifier) และ attachIPDF_JsPlatformเพื่อให้pdfium.dllที่ XFA-enabled สามารถ render และ script dynamic XFA forms ได้ - Unit
Lib\FPdfXfa.pasใหม่ที่ประกาศ XFA constants (FXFA_PAGEVIEWEVENT_*,FXFA_MENU_*,FXFA_SAVEAS_*,FPDF_FORMFIELD_XFA_*) และ typesTXfaPacket/TXfaSaveFormatที่ก่อนหน้านี้อ้างถึงเฉพาะใน comments เท่านั้น - XFA static packet reader บน
TPdf:GetXfaPacketCount/GetXfaPacketName/GetXfaPacketContent/GetXfaPacketByNameรวมถึงGetXfaTemplate/GetXfaDatasets/GetXfaConfigแยก XFA packetstemplate,datasetsและconfigเป็น raw XML โดยไม่ต้องใช้ XFA-enabled runtime — ซึ่งมีประโยชน์สำหรับ compliance auditing และ data migration - Capability probes: global
XfaFeaturesAvailableและ per-documentTPdf.XfaRuntimeAvailable(ว่าFPDF_LoadXFAสำเร็จจริงหรือไม่) และTPdf.XfaStaticReadable(ว่า packet reader exports resolve หรือไม่) TPdfFormFieldTypeขยายด้วยfiXfa,fiXfaCheckBox,fiXfaComboBox,fiXfaImageField,fiXfaListBox,fiXfaPushButton,fiXfaSignature,fiXfaTextFieldพร้อมDecodeFormFieldTypeที่ map ค่าFPDF_FORMFIELD_XFA_*ใหม่- JavaScript host events บน
TPdf:OnJavaScriptAlert,OnJavaScriptResponse,OnXfaGotoUrlและOnXfaRuntimeMissingช่วยให้ host customize JS dialogs และ XFA navigation หรือ react เมื่อเอกสาร XFA ไม่สามารถ run engine ได้ - ตัวอย่าง
XfaLabDelphi ใหม่ที่แสดง XFA detection, packet extraction, capability probing และ runtime-missing fallback path
เปลี่ยนแปลง (Changed)
TPdf.LoadDocumentในตอนนี้ pre-scan input สำหรับ XFA markers (/XFAใน AcroForm dictionary หรือ catalog/NeedsRendering) และเมื่อพบ จะ auto-selectpdfium.v8.dllโดย setEnableV8Engine := Trueก่อนที่ singleton library จะถูกโหลดครั้งแรก เมื่อpdfium.dllธรรมดาถูกโหลดแล้ว process ไม่สามารถ switch ได้ ดังนั้นOnXfaRuntimeMissingจะ signal กรณีนั้นTPdf.GetPageCountในตอนนี้สะท้อน page count ที่ XFA engine รายงานผ่านFFI_PageEventหลัง dynamic repagination แทนที่จะเป็นเฉพาะ static PDF page tree- เมื่อเอกสาร XFA ถูกเปิดแต่ runtime ไม่พร้อมใช้งาน
InitializeFormFillในตอนนี้ pinversion=1และxfa_disabled=1แทนที่จะ request version 2 พร้อม callbacks ที่ไม่ได้ assign ซึ่งก่อนหน้านี้เสี่ยงต่อ bad callback pointer dereference
Version 2.12.2
แก้ไขแล้ว (Fixed)
ValidatePdfAComplianceในตอนนี้รายงาน custom XMP namespaces ที่ใช้งานโดยไม่มีpdfaExtension:schemasในขณะที่ยังคงยอมรับ standardpdfaidmetadata โดยไม่มี extension declarations- PDF/A-3 embedded file validation ในตอนนี้กำหนดให้ทั้ง top-level
/Fและ/UFentries บน filespec dictionaries และ ignore nested/EFstream keys เมื่อตรวจสอบชื่อเหล่านั้น
Version 2.12.1
แก้ไขแล้ว (Fixed)
ValidatePdfAComplianceในตอนนี้ decode escaped PDF name tokens ก่อนที่จะจับคู่ JavaScript, LZWDecode, Type1 และชื่อต้องห้ามที่เกี่ยวข้อง ดังนั้นชื่อที่ obfuscated แต่ semantically identical จึงถูกรายงานอย่างถูกต้อง- PDF/A inline-image checks ในตอนนี้ reject ค่า
/Filterและ/Fที่ใช้/LZWDecode, abbreviated/LZWหรือ/Cryptรวมถึง array และ escaped-name forms - PDF/A validation ในตอนนี้รายงาน metadata streams ที่มี forbidden stream filters, OutputIntent ICC profiles ที่ component count
/Nหายไปหรือไม่สอดคล้อง และ PDF/A-3 embedded file specs ที่มี/AFRelationshipหายไปหรือไม่ถูกต้อง
Version 2.12.0
เพิ่มเติม (Added)
- TSA HTTP requests ในตอนนี้ set explicit 30 วินาที timeouts สำหรับแต่ละ phase (resolve/connect/send/receive) ผ่าน
WinHttpSetTimeoutsดังนั้น timestamp authority ที่ช้าหรือเข้าถึงไม่ได้จึงไม่สามารถ hang signing thread ได้ตลอดไปแทนที่จะพึ่งพา WinHttp implicit defaults - Per-request nonce derivation สำหรับ PAdES B-T / B-LTA timestamp requests เมื่อ caller ไม่ได้ระบุ
TPadesSignOptions.Nonce: SHA-256 fold ของ monotonic counter + wall clock +GetTickCount64+ process id แทนที่ fallback$100000000ที่กำหนดตายตัวก่อนหน้านี้ ดังนั้นสอง requests ที่ส่งในมิลลิวินาทีเดียวกันจึงไม่ reuse anti-replay nonce เดิมอีกต่อไป PdfInflateในตอนนี้ cap decompressed output ที่ 256 MiB เพื่อหยุด zlib-compressed stream ไม่ให้ใช้ memory จนหมดบน hostile หรือ corrupt input ("zlib bomb") โดย cap นั้น generous สำหรับ PDF stream จริงใดๆ
เปลี่ยนแปลง (Changed)
TPdfViewoverlay blending (search highlight, text selection, reading word, spread selection) ไม่ใช้ per-pixelGetPixel/SetPixelVอีกต่อไป โดย rectangle ในตอนนี้ถูก blend ผ่าน off-screenTBitmapแบบ 32-bpp และScanLineใน single pass ซึ่ง eliminate การ crossing GDI kernel หลายพัน ครั้งต่อการ paint และทำให้ selections ขนาดใหญ่ตอบสนองได้FPdfAsn1.TDerReader.ReadIntegerในตอนนี้ reject INTEGER fields ที่ยาวกว่า 8 ไบต์ (และ negatives แบบ 8-byte ที่ sign bit จะต้องการshl >= 64) โดยคืนค่า 0 แทนที่จะคำนวณค่าที่ผิดผ่าน undefined-shift behaviour บน CMS/PAdES ASN.1 inputParseTimeStampRespไม่ echo request nonce กลับเป็นTPadesTimestamp.Nonceอีกต่อไป จนกว่า TSTInfo walker ที่ verify returned nonce จะมาถึง field จะ stay ที่ 0 เพื่อ signal "not verified" แทนที่จะให้ callers มีความมั่นใจผิดๆ ว่า timestamp response นั้น fresh
แก้ไขแล้ว (Fixed)
PointsToPixelsคืนค่า input ที่ไม่เปลี่ยนแปลงสำหรับทุก DPI: divisor คือPointsPerInch(ค่าคงที่ 72) แทนที่จะเป็น literal 72 ทำให้ formula collapse เป็นResult := Pointsผู้เรียกภายนอกที่ทำ points→device-pixel sizing ผ่าน helper นี้ในตอนนี้จะได้รับPoints × PixelsPerInch / 72ที่ถูกต้องPdfMaxObjNumนับน้อยเกินไปบนเอกสารที่ใช้ object streams (PDF 1.5+ ObjStm): objects ที่บีบอัดภายใน/ObjStmไม่มี markerN 0 objดังนั้น raw-byte scan จึงพลาดมัน และ injectors ที่ allocateMaxObj+1สำหรับ objects ใหม่จะชนกับ ObjStm members ที่ซ่อนอยู่และทำให้ไฟล์เสียหายอย่างเงียบๆ โดย scan ในตอนนี้จะ expand object streams ก่อนเพื่อให้ทุกหมายเลขออบเจกต์มองเห็นได้InjectPdfAMarkersไม่ forge การ claim ความสอดคล้องของ PDF/A บนเอกสารที่เข้ารหัสอีกต่อไป: PDF/A (ISO 19005-1 §7.1) ห้ามการเข้ารหัส และ injector ก่อนหน้านี้จะคัดลอก source ผ่านพร้อม markers แม้ว่าการ validation ครั้งถัดไปจะ reject มัน เมื่อHasEncryptถูก set source จะถูกส่งผ่านโดยไม่เปลี่ยนแปลง pathTPdf.SaveAsPdfAปกติจะ strip encryption (saRemoveSecurity) ก่อน injection ดังนั้นนี้จะส่งผลกระทบเฉพาะ callers โดยตรงPdfReadStreamBytesในตอนนี้ refuse/Lengthที่ใหญ่กว่าไฟล์ทั้งหมดก่อนที่จะ allocate result buffer ปิด early-allocation path บน corrupt หรือ hostile indirect length
Version 2.11.0
เพิ่มเติม (Added)
- Record
FPDF_FILEHANDLERของ PDFium ในตอนนี้ประกาศ callbacks หกตัวของมัน (Release,GetSize,ReadBlock,WriteBlock,Flush,Truncate) เป็น fields จริงแทนที่จะเป็น comments ซึ่งตรงกับ C header layout โดย XFA FFI file-transfer callbacks (FFI_OpenFile/FFI_EmailTo/FFI_UploadTo/FFI_DownloadFromURL) ที่คืนค่าหรือใช้PFPDF_FILEHANDLERยังคงไม่ได้ implement ใน Pascal form-fill layer แต่ type ในตอนนี้มีโครงสร้างที่ถูกต้องสำหรับ XFA submit/upload path ในอนาคต - การโหลดและ unload ไลบรารี PDFium (
LoadLibrary/UnloadLibrary) ในตอนนี้ถูก serialise โดย process-global critical section ดังนั้น worker threadsTPdfFuture<T>สองตัว (หรือ worker ที่แข่งกับ main thread) จึงไม่สามารถ observePDFiumLibrary=0ทั้งคู่และ double-bind หรือ free DLL ขณะที่ thread อื่นกำลัง mid-bind ได้ - Section
initialization/finalizationในตอนนี้เรียกUnloadLibraryเมื่อ unit unload เพื่อให้FPDF_DestroyLibraryrun (worker-thread join, V8 isolate disposal, font/cache teardown) แทนที่จะพึ่งพา OS ในการ reclaim DLL
เปลี่ยนแปลง (Changed)
TPdf.SetActiveในตอนนี้ swallow exception ใดก็ได้ระหว่างการโหลด (ก่อนหน้านี้เฉพาะEPdfError) ดังนั้น stream error หรือ access violation ระหว่าง form/page setup จึงทำให้Active=Falseแทนที่จะเป็น component ที่โหลดบางส่วนพร้อม state ที่ไม่แน่นอน- Consistent character encoding สำหรับ PDFium metadata key arguments:
TPdf.GetMetaTextในตอนนี้ใช้ FPCAnsiString/ DelphiUTF8Encodesplit เดียวกับGetViewerPreferenceและ load paths แทนที่จะเป็น bareAnsiString(Tag)cast - Deduplicate helpers
BytesToAnsi,AnsiToBytes,WriteBytesและWriteStr:FPdfCompressในตอนนี้ import จากFPdfPdfCommon(aliasesWriteBytesToStream/WriteAnsiToStreamถูก retire) และBytesToAnsioverload แบบ three-argument ที่ซ้ำซ้อนในFPdfPdfaถูกลบออกFPdfAsn1คง local copy ไว้โดยตั้งใจเพื่อให้ cryptography layer ปราศจาก conformance-layer unit
แก้ไขแล้ว (Fixed)
- Resource leak ใน
TPdf.LoadDocument(file, memory,TBytes,TMemoryStream, custom stream) และTPdf.CreateDocument: ถ้าInitializeFormFillหรือReloadPageraise หลังจากFPDF_LoadDocument/FPDF_CreateNewDocumentสำเร็จ nativeFPDF_DOCUMENThandle ถูก leak เพราะFActiveยังเป็น False ณ จุดนั้น แต่ละ path ในตอนนี้ wrap post-load setup ในtry/exceptและปิดเอกสารเมื่อ fail ทำให้ component cleanly inactive - PDFium DLL load diagnostics ที่เป็นมิตรมากขึ้น:
CheckLoadLibraryตรวจจับERROR_BAD_EXE_FORMAT(193) และรายงาน 32/64-bit architecture mismatch ชี้ไปที่DLLs/Win32หรือDLLs/Win64build ที่ตรงกัน แทนที่จะ relay เฉพาะ generic OS errorCheckGetProcAddressในตอนนี้ระบุว่าpdfium.dllที่ deploy ไว้นั้นเก่ากว่า binding เมื่อ required export หายไป แทนที่จะเป็นแค่ข้อความ OS "procedure not found"
Version 2.10.1
แก้ไข (Fixed)
- การทำให้เป็นมาตรฐานของ sid ใน SignerInfo ของ PAdES: ตัวระบุผู้ลงนามในตอนนี้ใช้รูปแบบ RFC 5652 §5.3
issuerAndSerialNumber(issuer Name + serialNumber โดยทั้งคู่สกัดมาจาก DER ของใบรับรองผู้ลงนามตรงๆ ทุกตัวอักษร) แทนที่ค่าsubjectKeyIdentifierแบบไม่เป็นมาตรฐานรวมถึงค่าทดแทน full-cert SHA-256 ก่อนหน้านี้ซึ่ง Adobe Acrobat และตัวตรวจสอบที่สอดคล้องอื่นๆ ปฏิเสธ TbsCertificate DER walker ตัวใหม่ (ExtractIssuerAndSerial) จะอ่าน issuer SEQUENCE และ serial INTEGER ในรูปแบบไบต์ TLV ดิบ — เลข serial มักจะเกินช่วงInt64ดังนั้นจึงจำเป็นต้องใช้ TLV ดิบ ส่วนรูปแบบsubjectKeyIdentifierยังคงเหลือไว้เป็นทางเลือกสำรองเฉพาะเมื่อการแยกวิเคราะห์ cert DER ล้มเหลวเท่านั้น
เปลี่ยนแปลง (Changed)
TCmsSignerId.SerialNumber: Int64ถูกแทนที่ด้วยSerialDer: TBytes(TLV ของ serialNumber ดิบ) ตัวสร้าง CMS จะฝัง TLV ที่ตัดส่วนแล้วลงในIssuerAndSerialNumberตรงๆ ทุกตัวอักษร เพื่อหลีกเลี่ยงการล้นของInt64บน serial ของ CA ขนาด 20 ไบต์ (ขอบเขตบน RFC 5280 §4.1.2.2)
Version 2.10.0
เพิ่ม (Added)
- การตรวจสอบความถูกต้องระยะยาว PAdES B-LT: เมื่อ
TPadesSignOptions.Level >= plB_LT,SignPadesBytesจะเพิ่ม incremental update ที่บรรจุพจนานุกรม/DSSพร้อมใบรับรองผู้ลงนามและห่วงโซ่ intermediate ทั้งหมด (รากที่ลงนามด้วยตนเองถูกแยกออกตาม RFC 5652 §10.2.3) รวมถึงเครื่องหมาย/Extensions /ESICLevel 1 (EN 319 142-1 §5.4.2) - การประทับเวลาเก็บถาวร PAdES B-LTA: เมื่อ
Level >= plB_LTAและมีการตั้งค่าTsaUrl, พจนานุกรมลายเซ็น Document Time-stamp (/SubFilter /ETSI.RFC3161) จะถูกเพิ่มเข้ามาโดยที่/ByteRangeครอบคลุมไฟล์ทั้งหมด ส่วนเครื่องหมาย ESIC จะถูกเลื่อนระดับเป็น Level 2 นี่ถือเป็นการครบถ้วนของระดับ PAdES baseline ทั้งสี่ระดับ (B-B, B-T, B-LT, B-LTA) - การรวบรวมห่วงโซ่ใบรับรอง:
ResolveWinSignerในตอนนี้จะเรียกCertGetCertificateChainและเติมTPadesResolvedSigner.ChainCertDerด้วยใบรับรอง CA ระดับ intermediate เพื่อให้ B-LT/DSS /Certsบรรจุใบรับรองทุกใบที่จำเป็นในการตรวจสอบความถูกต้องของลายเซ็นโดยไม่ต้องค้นหาจากภายนอกCertFreeCertificateContextในตอนนี้ถูก bind แล้ว ซึ่งช่วยปิดการรั่วไหลของ one-context-per-sign ที่ระบุไว้ใน v2.8.0 - เวิร์กโฟลว์การผนวกรวม PDF/A:
TPdf.SignPadesWithPdfAจะแปลงเอกสารเป็น PDF/A ก่อน (ระดับสูงสุดที่ไลบรารีสร้างได้ในปัจจุบัน) จากนั้นจึงประทับลายเซ็น PAdES ตามที่ร้องขอ — ซึ่งเป็นรูปแบบคอนเทนเนอร์เก็บถาวรระยะยาวที่ EN 319 142-1 Annex A.7 แนะนำ
Version 2.9.0
เพิ่ม (Added)
- การประทับเวลาที่เชื่อถือได้ PAdES B-T:
TPadesSignOptionsได้รับฟิลด์Level,TsaUrlและNonceเพิ่มขึ้นมา เมื่อLevel >= plB_Tและมีการตั้งค่าTsaUrl,SignPadesBytesจะสกัดค่าลายเซ็นจาก CMS ที่สร้างขึ้น ร้องขอการประทับเวลา RFC 3161 เหนือค่าดังกล่าว และฝัง TimeStampToken ที่ได้รับกลับมาเป็นแอตทริบิวต์ unsigned ของ SignerInfo ชื่อsignature-time-stamp— ซึ่งเป็นขั้นตอน trusted-time ของ B-T (EN 319 142-1 §6.3 req o) FPdfTsa: ไคลเอนต์ RFC 3161 ข้ามแพลตฟอร์ม —BuildTimeStampReq(version 1, SHA-256 messageImprint เหนือค่าลายเซ็น, nonce, certReq=true),ParseTimeStampResp(ยอมรับ PKIStatus 0/1, ปฏิเสธ 2+, สกัด TimeStampToken ContentInfo ตรงๆ ทุกตัวอักษร) และRequestTimestamp(build+POST+parse ในครั้งเดียว)PadesTsaAvailableจะควบคุมการเปิดใช้งานคุณลักษณะนี้บนแพลตฟอร์มที่ไม่มีแบ็กเอนด์ HTTPFPdfTsaWin: แบ็กเอนด์ Windows WinHttp ที่ bind แบบไดนามิกจาก winhttp.dll (ไม่มี dependency เวลาคอมไพล์เพิ่มเติมเลย; HTTPS เจรจาโดยใช้คลังใบรับรองของ Windows) ทำงานตามรูปแบบ dynamic-binding ของFPdfCryptoWinFPdfCms:ExtractSignatureValueจะท่อง CMS ที่สร้างขึ้นเพื่อกู้คืน octet ของลายเซ็นดิบ (อินพุตแฮชของ TSA) และAddSignatureTimestampToCmsจะสร้าง ContentInfo ใหม่พร้อมunsignedAttrs [1](0xA1) ที่บรรจุแอตทริบิวต์การประทับเวลา ตัวตรวจสอบ stage-1 จะจดจำผลลัพธ์นี้ว่าเป็นลายเซ็น B-T
Version 2.8.0
เพิ่ม (Added)
- สแต็กการลงนาม PAdES B-B: บล็อกส่วนประกอบ pure-Pascal/ข้ามแพลตฟอร์มใหม่สี่ตัว (
FPdfSha256,FPdfAsn1,FPdfCms,FPdfCrypto) รวมถึงแบ็กเอนด์ Windows CNG (FPdfCryptoWin) ช่วยให้TPdf.SignPades/SignPadesToStreamสร้างลายเซ็น PAdES B-B ได้ครบทุกขั้นตอน ใบรับรองผู้ลงนามจะถูกแก้ไขโดยใช้ลายนิ้วมือ SHA-1 จากคลัง Current User “MY”; รองรับ RSA-PSS (แนะนำ), RSA PKCS#1 v1.5 และ ECDSA ทั้งหมดผ่านNCryptSignHash FPdfSha256: SHA-256 แบบ FIPS 180-4 ที่พึ่งพาตนเอง (Init/Update/Final + ตัวช่วย one-shot) เนื่องจาก FPC 3.2.2 ไม่ได้จัดส่งยูนิต SHA-2 ใดๆ ไลบรารีจึงต้องมีของตัวเองเพื่อให้ทุกพาธโค้ด CMS ใช้ประเภทTSHA256Digestเดียวกันโดยไม่มีการแยกสาขา RTLFPdfAsn1: ตัวเข้ารหัส DER (TDerWriter) และตัวอ่าน (TDerReader) ที่รองรับ SEQUENCE/SET/OID/INTEGER/OCTET STRING/UTCTime/GeneralizedTime/context-specific tags พร้อม definite-length encoding และการจัดการ IMPLICIT-tag ที่ CMS ต้องการFPdfCms: ตัวสร้าง CAdES SignedData (BuildSignedData) ที่ปล่อยแอตทริบิวต์ signed ของ content-type, message-digest และ signing-certificate-v2 ซึ่ง PAdES baseline กำหนด พร้อม signing-time และ commitment-type-indication แบบเลือกได้ แฮชของ signedAttrs จะถูกคำนวณบนรูปแบบที่ติดแท็ก SET (0x31) แล้วปล่อยออกมาใหม่ด้วยแท็ก IMPLICIT [0] (0xA0) ตาม RFC 5652 §5.4FPdfCrypto+FPdfCryptoWin: สิ่งที่เป็นนามธรรมของแบ็กเอนด์การเข้ารหัสลับพร้อมPadesCryptoAvailable/ResolvePadesSignerและการใช้งานบน Windows ที่ bind crypt32.dll / ncrypt.dll แบบไดนามิก (ไม่มี dependency DLL เวลาคอมไพล์เพิ่มเติม) ลายเซ็น ECDSA จะถูกเข้ารหัสใหม่จากรูปแบบ IEEE P1363 r¦s ของ Windows ไปเป็น DERECDSA-Sig-Valueที่ CMS ต้องการSignPadesBytes: การแทรกลายเซ็นระดับไบต์ — จองช่องเฮกซ์/Contentsที่มีความกว้างคงที่ คำนวณ/ByteRangeที่ครอบคลุม ย่อยเอกสาร สร้างและฝัง CMS แล้วเพิ่ม incremental update ตัวตรวจสอบ (v2.7.0) จะจดจำผลลัพธ์นี้ว่าเป็นลายเซ็น PAdES B-B
Version 2.7.0
เพิ่ม (Added)
- ตัวตรวจสอบโครงสร้าง PAdES (ETSI EN 319 142-1 V1.2.1): ยูนิต
FPdfPadesใหม่และเมธอดTPdf.ValidatePadesจะตรวจสอบพจนานุกรมค่าลายเซ็นที่เข้าถึงได้จาก/ByteRange, ท่องSignedDataของ CMS ภายใน/Contentsให้ลึกเพียงพอเพื่อยืนยันรูปร่าง detached ของ CAdES และตรวจจับระดับ baseline ทั้งสี่ระดับ (B-B, B-T, B-LT, B-LTA) รวมถึงพจนานุกรม Document Time-stamp (/SubFilter /ETSI.RFC3161) - ชุดปัญหาระดับข้อกำหนดของ PAdES: enum
ppei*จำนวน 26 ตัวครอบคลุมความเหมาะสมของ/SubFilter(adbe.pkcs7.sha1และadbe.x509.rsa_sha1ถูกตั้งค่าสถานะว่าเป็นสิ่งต้องห้าม), การครอบคลุมไฟล์ของ/ByteRange, การห้าม/Cert, รูปร่างSignedDataของ CMS (ผู้ลงนามเดียว, eContent แบบ detached, ช่วงเวอร์ชัน), แอตทริบิวต์ signed ที่จำเป็น (content-type,message-digest,signing-certificate/v2), แฮชที่ต้องห้าม (MD5, SHA-1), การกีดกันซึ่งกันและกันของ/Reasonกับcommitment-type-indication(req d), ข้อกำหนด trusted-time ของ B-T,/DSS+/Certs+ เครื่องหมาย ESIC Level 1 ของ B-LT และ Document Time-stamp + เครื่องหมาย ESIC Level 2 ของ B-LTA - ตัวแทรก DSS:
TPdf.SaveAsPadesDss/SaveAsPadesDssToStreamจะเพิ่ม incremental update ที่บรรจุพจนานุกรม/DSS(พร้อมอาเรย์สตรีม/Certs,/OCSPs,/CRLs) และเครื่องหมาย/Extensions /ESIC(Level 1 หรือ 2) ลงบนสำเนาของเอกสาร โดยคงไบต์ต้นฉบับไว้ — ซึ่งเป็นขั้นตอนการฝัง validation-material ของ B-LT/B-LTA (clause 5.4.2) - ระยะข้ามแพลตฟอร์มที่ไม่มี dependency: ตัวตรวจสอบและตัวแทรกเป็น pure-Pascal และทำงานบน IDE ที่รองรับทุกตัว (Delphi, Lazarus, FPC, C++Builder); ไม่ต้องใช้แบ็กเอนด์การเข้ารหัสลับสำหรับรุ่นนี้ และไม่มีการเพิ่ม dependency DLL ใหม่ใดๆ
Version 2.6.0
เปลี่ยนแปลง (Changed)
- การขจัดความซ้ำซ้อนข้ามมาตรฐาน: ฟังก์ชันตัวช่วยที่ซ้ำซ้อนอีกเจ็ดตัว (PdfEnclosingObjNum, PdfDictRefNum, PdfExpandObjectStreams, PdfTextStr, ExtractLiteralString, ExtractXmpAttr) ถูกนำออกจากยูนิตมาตรฐานแต่ละตัวและรวมเข้าเป็น
FPdfPdfCommonซึ่งช่วยลดภาระการดูแลรักษาโค้ด copy-paste ประมาณ ~300 บรรทัด - คุณภาพของ PreflightReport: ปัญหาคลาสเนื้อหาของ PDF/X และ PDF/E ที่ก่อนหน้านี้ตกผ่านไปอยู่ในหมวดหมู่ “missing marker” ทั่วไป ในตอนนี้จะมีหมวดหมู่ Content/Metadata/Security ที่ถูกต้องแม่นยำพร้อมคำแนะนำเฉพาะข้อกำหนด (enum ประมาณ ~15 ตัวครอบคลุมทั้งสองมาตรฐาน)
- ความครอบคลุมการทดสอบของ PDF/E และ PDF/R: enum ที่ไม่มีความครอบคลุมอีกหกตัวได้รับการทดสอบเชิงบวกแล้ว (
pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden,pveiEmbeddedFilesForbidden,pvriBadHeader,pvriProhibitedInfoEntry) - การแก้ไขการ build ของ Lazarus:
Tests.PdfVT(ยูนิต DUnitX เฉพาะ Delphi ที่เพิ่มใน v2.5.x) ในตอนนี้ถูกแยกออกจากโปรเจกต์ Lazarus เพื่อให้สามารถคอมไพล์ได้อีกครั้ง
Version 2.5.3
เพิ่ม (Added)
- ความสมบูรณ์ของ OutputIntent (PDF/X-4 §6.2.4):
pvviOutputIntentSchemeจะตั้งค่าสถานะ OutputIntent ที่/Sไม่ใช่/GTS_PDFX;pvviOutputIntentMissingIdentifierจะตั้งค่าสถานะเมื่อขาด/OutputConditionIdentifier - ข้อยกเว้น Reference XObject ของ PDF/VT-2 (§6.2.2):
pvviReferenceXObjectForbiddenจะไม่ทำงานอีกต่อไปสำหรับไฟล์PDF/VT-2ซึ่งสามารถใช้ Reference XObjects บนฐาน X-5g/5pg ได้อย่างถูกต้องตามกฎหมาย - การตรวจสอบอักขระของ boundary แบบ MIME (RFC 2046 §5.1.1):
vtmviBoundaryInvalidCharจะตั้งค่าสถานะ boundary ที่อักขระอยู่นอกเซต bchars หรือมีความยาวเกิน 70
แก้ไข (Fixed)
InjectPdfVTMarkersในตอนนี้จะเขียน/CreationDateและ/ModDateของ Info จากตัวเลือกการบันทึก ทำให้ไฟล์ที่สร้างขึ้นสามารถผ่านการตรวจสอบValidatePdfVTComplianceได้โดยไม่เกิดpvviInfoModDateMismatchลวง (ก่อนหน้านี้ตัวแทรกเขียนวันที่ XMP ใหม่แต่ปล่อยให้วันที่ในพจนานุกรม Info เหลือค้างเก่าไว้)
Version 2.5.2
เพิ่ม (Added)
- ความสอดคล้องของ
/ModDateของ Info (§6.3 NOTE 2, ฐาน PDF/X-4):pvviInfoModDateMismatchจะตั้งค่าสถานะพจนานุกรม Info ที่/ModDateหลังจากการทำให้เป็นมาตรฐานจาก PDF-date เป็น XMP-date แล้วไม่เท่ากับxmp:ModifyDate - ความสอดคล้องของชิ้นส่วน inline ของ PDF/VT-2s (Annex A.2): ตัวตรวจสอบ MIME ในตอนนี้จะเรียกใช้
ValidatePdfVTComplianceบนทุกส่วนapplication/pdfแบบ inline และตั้งค่าสถานะเนื้อหาที่ไม่ใช่ PDF/VT ผ่านvtmviInlinePdfNotPdfVT
Version 2.5.1
เพิ่ม (Added)
- การตรวจสอบการแบ่งกลุ่ม DParts (ISO 16612-2 §6.5 Table 4):
pvviDPartsBadChunkingจะตั้งค่าสถานะอาเรย์/DPartsที่ sub-array ที่ไม่ใช่ตัวสุดท้ายไม่มีรายการครบทั้งหมด 8192 รายการ หรือ sub-array สุดท้ายอยู่นอกช่วง 1..8192 - ความสอดคล้องของ RecordLevel ข้ามสตรีม (Annex A.2): ตัวตรวจสอบ MIME ของ PDF/VT-2s ในตอนนี้จะสกัด
/RecordLevelของ PDF inline แต่ละไฟล์และตั้งค่าสถานะความไม่ตรงกันผ่านvtmviRecordLevelMismatchซึ่งเป็นการเสริมการตรวจสอบ NodeNameList ที่มีอยู่เดิม - คำใบ้ของออบเจกต์กราฟิกที่เกิดซ้ำ (§6.7):
pvviGtsScopeInvalidValueจะตั้งค่าสถานะ/GTS_Scopeที่อยู่นอกเซต {SingleUse, Record, File, Stream, Global, Unknown};pvviGtsScopeRecordWithoutRecordLevelจะตั้งค่าสถานะ/Recordที่ไม่มี/RecordLevel;pvviGtsXidNotUuidจะตั้งค่าสถานะ/GTS_XIDที่ไม่ใช่ uuid: URI ตาม RFC 4122;pvviGtsEnvMissingจะตั้งค่าสถานะเมื่อขาด/GTS_Envในขณะที่/GTS_Scopeเป็น Stream หรือ Global (§6.7.4) - การตรวจจับ forward-reference ของ MIME (Annex A.2):
vtmviForwardReferenceจะตั้งค่าสถานะ PDF inline ที่อ้างถึงชื่อไฟล์ (ผ่าน/EF /F) ซึ่งไม่ได้ถูกแนะนำโดยส่วนแนบก่อนหน้าในสตรีม
แก้ไข (Fixed)
ExtractNodeNameListFromPdfและExtractRecordLevelFromPdfในFPdfPdfvtMimeได้แก้ไขข้อผิดพลาด off-by-one ที่เกิดซ้ำ ซึ่งออฟเซ็ตแบบ 1-based ที่ส่งคืนโดยAnsiFindKeyถูกนำไปใช้เป็นออฟเซ็ตไบต์แบบสัมบูรณ์บน PDF ที่ขยายแล้ว
Version 2.5.0
เพิ่ม (Added)
- ข้อมูลเมตา Document Part (DPM) ของ PDF/VT (ISO 16612-2 §6.6):
TPdfVTSaveOptionsได้รับDpmEntriesและDpmTargetเพิ่มขึ้นมา เพื่อให้ตัวเขียนสามารถแนบพจนานุกรม/DPMไปยังโหนด DPart ที่สังเคราะห์ขึ้น พร้อมการตรวจสอบชื่อคีย์กับกฎ second-class-prefix ของ Annex E และกฎ NMTOKEN / ความไม่ซ้ำ / รูปร่างGTS_Managedของ §6.6 บนฝั่งตัวตรวจสอบ - การแลกเปลี่ยนสตรีมมิ่ง PDF/VT-2s (Annex A): ยูนิต
FPdfPdfvtMimeใหม่จัดเตรียมBuildPdfVT2sStreamและValidatePdfVT2sStreamสำหรับเอนเวล็อป MIMEmultipart/mixedที่บรรจุชิ้นส่วน PDF/VT แบบ inline รวมถึงโปรไฟล์ ICC ที่แนบมา พร้อมกฎการจัดลำดับเฮดเดอร์X-PDFVT-Stream-version: 1และการตรวจสอบความสอดคล้องของNodeNameListข้ามสตรีม TPdf.ValidatePdfVTในตอนนี้จะทำการนับ JavaScript-action ที่เป็นทางการผ่านFPDFDoc_GetJavaScriptActionCountซึ่งเป็นการเสริมการสแกนชื่อ/JavaScriptระดับไบต์
แก้ไข (Fixed)
- ความถูกต้องของ
Trappedของ PDF/VT บนฐาน PDF/X-4: ค่า enumptvUnknownถูกนำออก (PDF/X-4 ห้าม/Unknown),ptvUnspecifiedถูกทำให้เป็นมาตรฐานเป็น/Falseณ เวลาเขียน (การขาด/Trappedก็ถูกห้ามเช่นกัน) และปัญหาใหม่pvviTrappedInvalidจะตั้งค่าสถานะค่าที่ขาดหายไปหรือค่าUnknown ValidatePdfVTComplianceในตอนนี้จะขยาย object streams (PdfExpandObjectStreams) ก่อนทำการสแกน เพื่อให้แคตตาล็อก, OutputIntent หรือพจนานุกรม Metadata ที่เก็บอยู่ภายใน ObjStm ที่ถูกบีบอัด (PDF 1.5+, ลักษณะเฉพาะของตัวสร้าง PDF/X-4) สามารถเข้าถึงได้โดยการค้นหาระดับไบต์
เปลี่ยนแปลง (Changed)
- PDF/VT-1 ในตอนนี้สืบทอดข้อห้ามเนื้อหา PDF/X-4 ทั้งหมด:
pvviAcroFormForbidden(/AcroFormหรือ/XFA),pvviAdditionalActionsForbidden(/AAของแคตตาล็อก),pvviMissingTrimBoxและpvviReferenceXObjectForbidden(Reference XObject, เฉพาะ X-5g/5pg เท่านั้น) - การขจัดความซ้ำซ้อนข้ามมาตรฐาน:
BuildDictObj,IccComponentCount, โปรไฟล์ ICC sRGB ในตัว (GetSrgbIccProfile),PdfTextStr,PdfEnclosingObjNum,PdfDictRefNumและPdfExpandObjectStreamsถูกเลื่อนระดับจากสำเนาในเครื่องที่ซ้ำกันสามชุดในFPdfPdfa/FPdfPdfx/FPdfPdfvtไปยังตำแหน่งที่เป็นทางการเดียวในFPdfPdfCommon; ลิเทอรัล ICC ขนาด 3144 ไบต์ในตอนนี้มีอยู่เพียงครั้งเดียวในโค้ดเบส
Version 2.4.0
แก้ไขแล้ว (Fixed)
InjectPdfUaMarkersจะไม่ละทิ้งการอ้างอิง trailer/Infoบนฐานของสตรีมการอ้างอิงไขว้ (cross-reference-stream) อีกต่อไป:SourceTrailerInfoRefในเครื่อง (ซึ่งขาดการสืบทอด xref-stream fallback) ถูกแทนที่ด้วยPdfSourceTrailerInfoRefที่ใช้ร่วมกัน (ซึ่งโปรโมตมาจากสำเนา PDF/A ที่มี fallback อยู่แล้วตั้งแต่ v2.0.0)PdfReadStreamBytesที่ใช้ร่วมกันตอนนี้สามารถจัดการการอ้างอิง/Length N G Rทางอ้อมได้แล้ว (พอร์ตมาจากสำเนา PDF/A ในเครื่อง) ส่งผลให้เครื่องมือตรวจสอบความถูกต้องของ PDF/VT, PDF/R และ PDF/E จะไม่สามารถอ่านผิดพลาดหรือข้ามสตรีมข้อมูลเมตา XMP ที่สร้างโดยเครื่องมือที่ใช้ Length ทางอ้อมได้อีกต่อไป (Acrobat, Ghostscript)
เปลี่ยนแปลงแล้ว (Changed)
- การขจัดความซ้ำซ้อนข้ามมาตรฐาน: สำเนา
PdfReadTrailerในเครื่องในFPdfPdfaและFPdfPdfx, สำเนาSourceTrailerInfoRefในเครื่องในFPdfPdfaและFPdfPdfuaรวมถึงPdfReadStreamBytesในเครื่องในFPdfPdfaถูกลบออกทั้งหมดแล้ว — เวอร์ชันFPdfPdfCommonที่ใช้ร่วมกันจะมีผลบังคับใช้ทุกที่ ซึ่งช่วยลบโค้ดที่ซ้ำซ้อนประมาณ ~330 บรรทัดและขจัดภาระในการดูแลรักษาสำเนาเหล่านั้นให้ตรงกัน - การลดช่องว่างในการทดสอบของ PDF/X: enum คลาสเนื้อหาเจ็ดรายการที่ก่อนหน้านี้ไม่มีความครอบคลุมในการทดสอบเลย ได้รับการทดสอบเชิงบวกแล้ว (
pvxiLzwForbidden,pvxiJavaScriptForbidden,pvxiFormFieldsForbidden,pvxiAdditionalActions,pvxiEmbeddedFilesForbidden,pvxiMissingTrimBox,pvxiTrappedNotSet)
Version 2.3.0
เปลี่ยนแปลงแล้ว (Changed)
- การลดช่องว่างในการทดสอบของ PDF/A ยังคงดำเนินต่อไป: enum อีกสามรายการที่ไม่มีความครอบคลุมในการทดสอบเลยได้รับการทดสอบเชิงบวกแล้ว;
pvaiForbiddenRenderingIntent(§6.2.9) จะตั้งค่าสถานะชื่อ rendering-intent ที่ไม่ใช่มาตรฐานในสตรีมเนื้อหา;pvaiJpeg2000Violation(§6.2.2) จะตั้งค่าสถานะภาพ JPXDecode ที่มี/NumComponentsอยู่นอกช่วง {1,3,4} ที่ Part 2;pvaiInlineImageLzwForbidden(§6.1.10) จะตั้งค่าสถานะภาพแบบอินไลน์ที่ใช้ตัวกรอง LZW ที่ Part 2
Version 2.2.0
เปลี่ยนแปลง
- การทดสอบการถดถอยของ cross-reference-stream:
Validate_XrefStreamTrailer_DetectsConformanceที่มีอยู่จะตรวจสอบด้วยว่าการอ้างอิง/Metadataของแคตตาล็อกได้รับการแก้ไขและมีการอ่านpdfaid:partของ XMP บนฐาน xref-stream (ไม่ใช่แค่/Root+/ID) แล้ว นอกจากนี้ยังมีการทดสอบInjectPdfA_XrefStreamBase_RoundTripsใหม่เพื่อป้องกันพาธ xref-stream ของตัวแทรกข้อมูลที่เพิ่มเข้ามาใน v2.0.0 รวมถึงการทดสอบข้ามมาตรฐานสองรายการ (PdfE_XrefStreamBase_NotRejectedAsUnparsable,PdfR_XrefStreamBase_NotRejectedAsUnparsable) เพื่อตรวจสอบว่าตัวตรวจสอบ PDF/E และ PDF/R จะไม่ปฏิเสธ PDF แบบ xref-stream ว่าไม่สามารถแยกวิเคราะห์ได้อีกต่อไป - การปิดหนี้การทดสอบ (test-debt closure) ของ PDF/A:
Validate_MinimalPdf_FlagsRequiredMarkersจะยืนยันว่า PDF ขั้นต่ำเปล่าจะทริกเกอร์pvaiMissingPdfAIdentifier,pvaiMissingOutputIntent,pvaiMissingIccProfile,pvaiMissingXmpMetadataและpvaiMissingXmpDates— ซึ่งช่วยปิดช่องว่างความสมมาตรกับตัวตรวจสอบ PDF/E และ PDF/X ที่มีการทดสอบที่เทียบเท่ากันอยู่แล้ว นอกจากนี้ยังมีอีนัมสองตัวที่เคยมีความครอบคลุมการทดสอบเป็นศูนย์ที่ได้รับการทดสอบเชิงบวก (positive tests) ได้แก่pvaiUnembeddedFontและpvaiSubsetMissingCidSet
Version 2.1.0
แก้ไข
- PDF/E ถูกละเลยโดยไม่ได้ตั้งใจจากการแก้ไข cross-reference-stream ใน v2.0.0: เนื่องจากทั้ง
InjectPdfEMarkersและValidatePdfEComplianceยังคงเรียกใช้PdfReadTrailerโดยไม่มีAcceptXrefStreamส่งผลให้ตัวแทรกข้อมูล PDF/E ล้มเหลวอย่างเงียบๆ บนเอาต์พุต PDF 1.5+ (ซึ่งเป็นค่าเริ่มต้นของSaveAsCopyใน pdfium) โดยในตอนนี้ทั้งสองตำแหน่งที่เรียกใช้จะส่งค่าTrueแล้ว - กลไกสำรอง (fallback) ของ cross-reference-stream ใน
PdfReadTrailerที่ใช้ร่วมกัน ในตอนนี้จะมีตัวป้องกัน/Type /XRefที่สำเนาท้องถิ่นของ PDF/A และ PDF/X มีอยู่แล้ว เพื่อให้ค่าออฟเซ็ตstartxrefที่เสียหายซึ่งชี้ไปยังพจนานุกรม (dictionary) อื่นที่ไม่เกี่ยวข้องล้มเหลวอย่างหมดจด แทนที่จะถูกแยกวิเคราะห์ผิดพลาดว่าเป็น trailer - ตัวแก้ไข
/Langสำหรับการอ้างอิงทางอ้อม (indirect-reference) ในValidatePdfUaCompliance(v2.0.0) ไม่สามารถเข้าถึงได้: เนื่องจากPdfFindObjDictค้นพบเฉพาะพจนานุกรม<<เท่านั้น แต่วัตถุสตริง/Langจะเป็น(...)หรือ<...>ที่ไม่มีพจนานุกรม โดยได้รับการแทนที่ด้วยการสแกนเนื้อหาวัตถุโดยตรงเพื่อค้นหาทิเก็ตสตริง (string token)
เปลี่ยนแปลง
- ฟังก์ชันตัวช่วยที่ซ้ำซ้อนและไม่ได้ใช้งาน (dead-shadow helper duplicates) เจ็ดตัว (PdfStructureBytes, PdfHasName, PdfCountName, BuildStreamObj) ซึ่งมีไบต์เหมือนกันทุกประการกับเวอร์ชันใน
FPdfPdfCommonที่ใช้ร่วมกัน ได้ถูกนำออกจากFPdfPdfaและFPdfPdfuaแล้ว — โดยในตอนนี้จะใช้งานเวอร์ชันที่ใช้ร่วมกันในทุกที่ผ่านusesแทน
Version 2.0.0
แก้ไข
- ความล้มเหลวอย่างเงียบๆ ข้ามมาตรฐาน: ฟังก์ชันตัวช่วย
PdfReadTrailerที่ใช้ร่วมกัน (ซึ่งใช้งานโดยตัวแทรกข้อมูลตัวชี้วัดและเครื่องมือตรวจสอบของ PDF/UA, PDF/X, PDF/VT และ PDF/R) ในตอนนี้ยอมรับพารามิเตอร์AcceptXrefStreamและจะใช้กลไกสำรองไปยังพจนานุกรมวัตถุของ cross-reference-stream เมื่อไม่มีคีย์เวิร์ดtrailerปรากฏอยู่ (PDF 1.5+) ก่อนหน้านี้ เอาต์พุตSaveAsCopyของ pdfium (ซึ่งใช้ cross-reference stream) ทำให้ตัวแทรกข้อมูลตัวชี้วัดทุกตัวล้มเหลวอย่างเงียบๆ — โดยไบต์ต้นทางถูกคัดลอกผ่านไปโดยไม่มีการเปลี่ยนแปลงใดๆ และการเรียกใช้งานยังคงส่งคืนค่าสำเร็จ ส่วนตัวตรวจสอบ PDF/R-1.0 (ซึ่งมีฐาน PDF 2.0 เป็น cross-reference stream เสมอ) ก็ไม่มีการทำงานใดๆ เกิดขึ้นจริง (no-op) ทั้งนี้ ได้มีการพอร์ตการทำงานที่สมบูรณ์ของตัวตรวจสอบ PDF/A ไปยังฟังก์ชันตัวช่วยที่ใช้ร่วมกันนี้เพื่อให้ทุกมาตรฐานได้รับประโยชน์ - การสแกนพจนานุกรม trailer ใน
InjectPdfUaMarkersและInjectPdfAMarkersในตอนนี้จะใช้PdfDictEndที่รับรู้ความลึก (depth-aware) แทนการค้นหาด้วย>>เปล่า เพื่อไม่ให้ trailer ที่มีพจนานุกรมซ้อนกัน (เช่น/Encrypt << ... >>) ถูกตัดสั้นลงก่อนจะถึงรายการ/Infoที่ตามหลังมา
เปลี่ยนแปลง
- ในตอนนี้
TPdf.ValidatePdfUaจะระงับการแจ้งเตือนpvuaiFontNotEmbeddedระดับไบต์แบบคร่าวๆ เมื่อมีการทริกเกอร์pvuaiPdfiumFontNotEmbeddedของโมเดลวัตถุ (object-model) Pdfium ที่แม่นยำแล้ว เพื่อไม่ให้รายงาน preflight มีแถว "embed your fonts" ที่เกือบจะซ้ำกันสองแถวสำหรับข้อบกพร่องเดียวกัน - ในตอนนี้
pvuaiLangInvalidFormat(§7.2) จะแปลงค่า/Langที่อ้างอิงทางอ้อม (indirect-reference) (N 0 R) ไปเป็นวัตถุสตริงของมันและตรวจสอบความถูกต้องของเนื้อหา ส่งผลให้แท็กภาษาที่อ้างอิงทางอ้อมไม่เป็นจุดบอดอีกต่อไป
Version 1.99.0
แก้ไข
pvuaiLangInvalidFormat(§7.2) จะไม่ปล่อยให้สตริง/Langที่เข้ารหัสฐานสิบหกผ่านไปได้ง่ายๆ อีกต่อไป: โดยในตอนนี้คู่ UTF-16BE (ที่มีFE FFBOM) และสตริงฐานสิบหก ASCII เปล่าจะถูกถอดรหัสและส่งไปตรวจสอบไวยากรณ์ BCP 47 เช่นเดียวกับสตริงลิเทอรัล(...)ส่งผลให้ตรวจพบ/Langฐานสิบหกที่ผิดรูปแบบ ในขณะที่สตริงที่ถูกต้องตามข้อกำหนด (เช่น UTF-16BEen-US) จะไม่เสี่ยงต่อการถูกแจ้งเตือนอีกต่อไป
เปลี่ยนแปลง
pvuaiFontMissingToUnicode(§7.21.7) ได้รับการยกเว้น/MacExpertEncodingร่วมกับ/WinAnsiEncodingและ/MacRomanEncodingในตอนนี้ ซึ่งตรงกับเงื่อนไขการยกเว้นสี่ประการที่ระบุไว้ในข้อกำหนด
Version 1.98.0
เพิ่มเติม
pvuaiNeedAppearancesTrue(§7.18.4) ตั้งค่าสถานะ AcroForm ที่มีแฟลก/NeedAppearancesเป็น true เพื่อป้องกันไม่ให้รูปลักษณ์ของวิดเจ็ตถูกล็อกอย่างน่าเชื่อถือ และเทคโนโลยีสิ่งอำนวยความสะดวกไม่สามารถเชื่อมโยงวิดเจ็ตเหล่านั้นกับโครงสร้างต้นไม้ได้ โดยพอร์ตมาจากเครื่องมือตรวจสอบ PDF/A และกำหนดให้สแกนเฉพาะเมื่อมี/AcroFormเพื่อจำกัดขอบเขตการสแกนให้แคบลง
เปลี่ยนแปลง
- การถดถอยของคลังข้อมูล (corpus) veraPDF: เชื่อมโยงคู่ผ่าน+ล้มเหลวของ §7.20 Reference-XObject และคู่ผ่าน+ล้มเหลวของซับเซ็ต CharSet/CIDSet ใน §7.21.4.2 เข้ากับ
Live_Corpus_ValidatePdfUaMatchesConformanceโดยตัวอย่างที่ผ่านของค่าต้องห้าม §7.21.7 ToUnicode และสื่อคลิป §7.18.6.2 ก็ถูกเชื่อมโยงเป็นตัวป้องกันผลบวกปลอมเช่นกัน (ตัวอย่างที่ล้มเหลวใช้รูปแบบพจนานุกรมที่การสแกนระดับไบต์ไม่สามารถตรวจจับได้ ดังนั้นจึงเชื่อมโยงเฉพาะส่วนที่ผ่านเท่านั้น) - รายการการยืนยันพาธที่ผ่านของคลังข้อมูลมีตัวป้องกันผลบวกปลอมเป็นศูนย์ใหม่ 15 ตัว เพื่อให้การตรวจสอบระดับไบต์และโครงสร้าง
pvuai*ที่ทำงานอยู่ทุกตัวถูกทดสอบกับตัวอย่างที่ถูกต้องตามข้อกำหนด (ก่อนหน้านี้มีปัญหาที่ทำงานอยู่เพียงประมาณ 30 จาก 60 ปัญหาที่ได้รับการป้องกัน) โดยตัวป้องกันสำหรับpvuaiLangInvalidFormatถูกละเว้นไว้โดยเจตนา เนื่องจากเครื่องมือตรวจสอบระดับไบต์จะตั้งค่าแจ้งเตือนสตริง/Langที่เข้ารหัสฐานสิบหกอย่างระมัดระวังหากไม่สามารถถอดรหัสได้
Version 1.97.0
แก้ไข
- การเพิ่มความแข็งแกร่งของ
ValidatePdfUaStructureElements: การท่องห่วงโซ่หลักของEnclosingTableในตอนนี้จะมีตัวนับการกระโดด (hop counter) ซึ่งจำกัดโดยจำนวนอิลิเมนต์ เพื่อไม่ให้การวนซ้ำParentIndexที่ผิดรูปแบบในอาเรย์อิลิเมนต์โครงสร้างสังเคราะห์ทำให้ผู้เรียกหยุดทำงาน การจัดสรรอาเรย์รหัสเนื้อหาที่ทำเครื่องหมาย (marked-content-ID) ของValidatePdfUaPageContentTaggingในตอนนี้ถูกจำกัดไว้ที่หนึ่งล้านรายการ เพื่อป้องกันการจัดสรรพื้นที่ขนาดหลายกิกะไบต์จากMarkedContentIDที่ผิดรูปแบบหรือเป็นอันตราย
เปลี่ยนแปลง
- ความเห็นประกอบมอนิตอร์ของอีนัม
pvuaiOrderedListMissingListNumberingในตอนนี้อธิบายสิ่งที่การตรวจสอบทำได้อย่างถูกต้อง: โดยจะตั้งค่าแจ้งเตือนอิลิเมนต์Lที่มีค่าListNumberingอยู่นอกชุดตาราง ISO 32000-1 Table 347 (แอตทริบิวต์ที่ไม่ปรากฏจะไม่ถูกแจ้งเตือน) ความเห็นก่อนหน้านี้บอกเป็นนัยว่าระบบสามารถตรวจจับรายการจัดลำดับที่ขาดแอตทริบิวต์ได้ด้วย ซึ่งการใช้งานจริงไม่ได้ทำเช่นนั้น - ตัวอย่างความล้มเหลวของคลังข้อมูลที่ไม่ตรงกันสองตัวสำหรับ
7.21.3.3-t02WMode ในตอนนี้ถูกเชื่อมโยงเข้ากับLive_Corpus_ValidatePdfUaMatchesConformance— ตั้งแต่ v1.95.0 สตรีม CMap ได้ถูกขยายด้วย FlateDecode ดังนั้นการเปรียบเทียบระหว่างพจนานุกรมและเนื้อหาจึงสามารถทำได้บนฝั่งที่อ่านได้ โดยความคิดเห็นที่ล้าสมัยเกี่ยวกับ "ไม่ได้เชื่อมโยง" ได้ถูกนำออกไปแล้ว
Version 1.96.0
เพิ่มเติม
- ความสอดคล้องข้ามมาตรฐาน:
TPdf.ValidatePdfUaได้รับการตรวจสอบสองรายการที่พอร์ตมาจากเครื่องมือตรวจสอบ PDF/A โดยpvuaiAnnotationFlagsViolation(§7.18.1) จะตั้งค่าแจ้งเตือนคำอธิบายประกอบที่ไม่ได้รับการยกเว้นซึ่งมีแฟลก Hidden / Invisible / NoView ซึ่งจะขัดขวางการอ่านของเทคโนโลยีสิ่งอำนวยความสะดวก และpvuaiActionTargetMissing(§7.18.5) จะตั้งค่าแจ้งเตือนการทำงาน GoToR / URI / SubmitForm ที่ไม่มีคีย์เป้าหมายที่จำเป็น (/F+/D, /URI, /F) ทำให้เทคโนโลยีสิ่งอำนวยความสะดวกไม่สามารถใช้งานลิงก์นั้นได้
แก้ไข
- การผสานโครงสร้างต้นไม้ข้ามหน้า: ลูปสะสม
AllElemsในTPdf.ValidatePdfUaในตอนนี้จะปรับฐานของParentIndexของแต่ละอิลิเมนต์จากอาเรย์ท้องถิ่นของหน้าไปยังอาเรย์ที่ผสานแล้ว หากไม่มีขั้นตอนนี้ อิลิเมนต์ลูกของหน้า 2 จะยังคงใช้ดัชนีท้องถิ่นของหน้าซึ่งชี้ไปยังส่วนแบ่งของหน้า 1 ส่งผลให้เกิดการเสียหายของการตรวจสอบที่ขึ้นกับ ParentIndex ทั้งหมดอย่างเงียบๆ (โครงสร้างตาราง/รายการ, จำนวนลูก H ใน §7.4.4, EnclosingTable) - การแยกวิเคราะห์ RoleMap:
PdfReadRoleMapPairsจะไม่สิ้นสุดการสแกนคีย์/ค่าทั้งหมดเมื่อค่าเป็นประเภทการอ้างอิงทางอ้อม (N 0 R) หรืออาเรย์ ([...]) — ซึ่งทั้งสองรูปแบบเป็นรูปแบบ RoleMap ที่ถูกต้องตาม ISO 32000-1 14.8.5.1 โดยในตอนนี้จะข้ามเฉพาะรายการนั้น (Continue) แทนที่จะทำการสั่งBreakซึ่งช่วยลดการรายงานผลบวกปลอมของpvuaiRoleMapUnresolvedสำหรับประเภทข้อมูลที่แมปหลังจากรายการอ้างอิงทางอ้อมหรืออาเรย์
เปลี่ยนแปลง
FPdfPreflightReport: ค่าTPdfUaValidationIssueที่ทำงานอยู่ 18 ค่าซึ่งก่อนหน้านี้ถูกจัดอยู่ในประเภทตัวชี้วัดที่ขาดหายไปและการแนะนำทั่วไป ในตอนนี้จะมีหมวดหมู่ที่ถูกต้องแม่นยำ (โครงสร้าง / เนื้อหา / ข้อมูลเมตา / ความปลอดภัย) พร้อมคำแนะนำเฉพาะข้อกำหนด และยังแก้ไขการสะกดผิดของpuaNone / pua1→pucNone / puc1ในPDFSpecComplianceMatrix.mdอีกด้วย
Version 1.95.0
เปลี่ยนแปลง
- การเรียกคืนและความสมบูรณ์ของ
TPdf.ValidatePdfUa: การตรวจสอบpvuaiCMapWModeMismatchใน §7.21.3.3 และการตรวจสอบpvuaiToUnicodeForbiddenValueใน §7.21.7 ในตอนนี้จะทำการขยายสตรีม CMap / ToUnicode ที่บีบอัดด้วยFlateDecodeก่อนทำการสแกน (ก่อนหน้านี้จะตรวจสอบเฉพาะสตรีมที่ไม่บีบอัด ซึ่งเป็นจุดที่เกิดผลลบปลอมที่ทราบกันดี) โดยตัวช่วยร่วมPdfInflate/PdfReadAndDecodeStreamได้รับการเลื่อนระดับจากFPdfPdfa/FPdfPdfxไปยังFPdfPdfCommonเพื่อให้หน่วยตรวจสอบความสอดคล้องทั้งหมดใช้โค้ดร่วมกันตัวเดียวกัน
เพิ่มเติม
pvuaiSubsetCharSetEmpty(§7.21.4.2) ตั้งค่าแจ้งเตือนสำหรับ Type 1 ซับเซ็ตFontDescriptorที่มีคีย์/CharSetซึ่งค่าสตริงว่างเปล่า — ในขณะที่pvuaiSubsetMissingCharSetเดิมตรวจจับเฉพาะกรณีไม่มีคีย์เท่านั้น และการตั้งค่าแจ้งเตือนจะไม่เกิดขึ้นสำหรับ/CIDSetที่ว่างเปล่า เนื่องจากฟอนต์ที่ไม่มี CID อาจมีบิตแมปว่างเปล่าได้อย่างถูกต้องตามกฎหมาย
Version 1.94.0
เพิ่มเติม
- การตรวจสอบ
TPdf.ValidatePdfUaรอบที่สองได้ปิดช่องว่าง ISO 14289-1 หกประการที่พบจากการตรวจสอบทีละข้อกำหนดและการสแกน API ดั้งเดิมของ Pdfium ซ้ำอีกครั้งที่ถูกห่อหุ้มไว้แล้วแต่ไม่ได้ใช้งานโดยพาธ PDF/UA:pvuaiHeadingFormatInvalid(§7.4.3) จะตั้งค่าแจ้งเตือนแท็กหัวข้อที่ผู้ใช้กำหนดซึ่งขึ้นต้นด้วย H แต่มีตัวคั่น ช่องว่าง หรือตัวเลขโรมัน แทนที่จะเป็นตัวเลขอารบิกล้วน,pvuaiMissingDocumentOutline(§7.17, should) จะตั้งค่าแจ้งเตือนเอกสารหลายหน้าทีไม่มีเค้าร่างบุ๊กมาร์ก (เอกสารหน้าเดียวจะได้รับการยกเว้น),pvuaiStructElementLangInvalid(§7.2) จะตั้งค่าแจ้งเตือนค่า/Langของอิลิเมนต์โครงสร้างที่ไม่ใช่แท็ก BCP 47 ที่ถูกต้อง,pvuaiWidgetMissingPrintField(§7.14 / §7.18.4) จะตั้งค่าแจ้งเตือนอิลิเมนต์โครงสร้าง Widget ที่ไม่มีเจ้าของแอตทริบิวต์ PrintField,pvuaiLinkNotInStructureTree(§7.18.5) จะตั้งค่าแจ้งเตือนเอกสารที่คำอธิบายประกอบ/Subtype /Linkคำอธิบายประกอบไม่ได้ถูกนำเสนอเป็นอิลิเมนต์โครงสร้าง Link, และpvuaiPdfiumAnnotationMissingContentsกับpvuaiPdfiumLinkMissingContents(§7.18.1 / §7.18.5) ได้เพิ่มการสแกนคำอธิบายประกอบโมเดลวัตถุ Pdfium ที่แม่นยำซึ่งได้รับการยกเว้นสำหรับคำอธิบายประกอบที่ซ่อนอยู่ นอก CropBox แบบป็อปอัป และวิดเจ็ต — ช่วยขจัดปัญหาผลบวกปลอมจากการสืบค้นระดับไบต์ซึ่งไม่สามารถอ่านแฟลก/Fหรือ/Rectได้
Version 1.93.0
เพิ่มเติม
TPdf.ValidatePdfUaในตอนนี้ได้เพิ่มเลเยอร์โมเดลวัตถุ Pdfium ทับบนการตรวจสอบระดับไบต์ ซึ่งเลียนแบบสถาปัตยกรรมรอบที่ 7 ของ PDF/A: โดยทำการท่องไปตามวัตถุข้อความของแต่ละหน้าผ่านFPDFTextObj_GetFont→FPDFFont_GetIsEmbedded(pvuaiPdfiumFontNotEmbedded, §7.21.4) และสแกนทุกอักขระผ่านFPDFText_HasUnicodeMapError(pvuaiPdfiumUnicodeMapError, §7.21.7) และFPDFText_GetUnicode(pvuaiPdfiumNotDefGlyph, §7.21.8) — ซึ่งมีความแม่นยำมากกว่าการตรวจสอบระดับไบต์ที่จะทริกเกอร์เฉพาะเมื่อไม่มีโปรแกรมฟอนต์เลยหรือไม่มี/ToUnicodeปรากฏเลย โดยการท่องไปจะหยุดทำงานก่อนในสามระดับ: ลูปหน้าจะสิ้นสุดลงเมื่อมีการตั้งค่าปัญหาเลเยอร์ Pdfium ทั้งสามข้อแล้ว ลูประดับวัตถุจะสิ้นสุดเมื่อพบฟอนต์แรกที่ไม่ได้ฝังตัว และการสแกนอักขระจะข้ามการตรวจสอบอักษรทดแทน.notdefเมื่อเกิดปัญหาUnicodeMapErrorขึ้นแล้ว โดย PDF/UA เป็นตัวตรวจสอบมาตรฐาน PDF ตัวสุดท้ายที่เดิมไม่มีเลเยอร์โมเดลวัตถุ Pdfium
Version 1.92.0
เพิ่มเติม
- สร้าง
Tests.PdfR— ซึ่งเป็นไฟล์ทดสอบแรกสำหรับตัวตรวจสอบ PDF/R-1 (FPdfPdfr) ครอบคลุมการตรวจสอบส่วนหัว ข้อห้ามใช้งาน ObjStm การตรวจจับ raster-marker และการป้องกันผลบวกปลอมบนไฟล์ที่สะอาด ในตอนนี้ชุดทดสอบมาตรฐาน PDF ทั้งหกชุดมีไฟล์ทดสอบเฉพาะแล้ว: PdfA(80), PdfUa(101), PdfX(7), PdfE(5), PdfVT(15), PdfR(4) = รวมทั้งหมด 212 การทดสอบ
Version 1.91.0
เพิ่มเติม
ValidatePdfEและValidatePdfVTได้รับการตรวจสอบระดับเนื้อหาซึ่งก่อนหน้านี้มีเฉพาะในตัวตรวจสอบ PDF/A, PDF/UA และ PDF/X:pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden(เฉพาะ PDF/E),pveiEmbeddedFilesForbidden(เฉพาะ PDF/E),pveiOpiForbidden,pvviLzwForbidden,pvviJavaScriptForbidden,pvviEmbeddedFilesForbidden,pvviOpiForbiddenนอกจากนี้TPdf.ValidatePdfEและTPdf.ValidatePdfVTยังได้รับเลเยอร์โมเดลวัตถุ Pdfium (pveiPdfiumFontNotEmbedded/pvviPdfiumFontNotEmbedded) ซึ่งจะท่องไปตามวัตถุข้อความของหน้าผ่านFPDFFont_GetIsEmbeddedและสิ้นสุดการทำงานเมื่อพบฟอนต์แรกที่ไม่ได้ฝังตัว
Version 1.90.0
เพิ่มเติม
TPdf.ValidatePdfXในตอนนี้ได้เพิ่มเลเยอร์โมเดลวัตถุ Pdfium ทับบนการตรวจสอบระดับไบต์: โดยจะท่องไปตามวัตถุข้อความของแต่ละหน้าผ่านFPDFTextObj_GetFont→FPDFFont_GetIsEmbeddedและรายงานฟอนต์ที่ไม่ได้ฝังตัวเป็นpvxiPdfiumFontNotEmbedded— ซึ่งมีความแม่นยำมากกว่าการตรวจสอบระดับไบต์ที่พึ่งพากลไกแบบคร่าวๆ ซึ่งจะทริกเกอร์เฉพาะเมื่อไม่มีโปรแกรมฟอนต์เลย โดยการท่องไปจะหยุดทำงานทันทีที่พบฟอนต์แรกที่ไม่ได้ฝังตัว
เปลี่ยนแปลง
- การท่องโครงสร้างต้นไม้ของ
TPdf.ValidatePdfUa: การเรียกใช้ValidatePdfUaPageContentTaggingในแต่ละหน้า (ซึ่งสร้างแผนผังการถือสิทธิ์ของรหัสเนื้อหาที่ทำเครื่องหมายและตรวจสอบข้ามทุกวัตถุข้อความ/รูปภาพ) ในตอนนี้จะถูกข้ามบนหน้าถัดๆ ไปทันทีที่พบpvuaiUntaggedContent— แม้จะยังคงมีการรวบรวมอิลิเมนต์โครงสร้างเพื่อตรวจสอบความสอดคล้องข้ามหน้า (เช่น รหัสเฉพาะของโหนด, ลำดับหัวข้อ) แต่ขั้นตอนการตรวจสอบเนื้อหาในแต่ละหน้าที่ใช้ทรัพยากรสูงจะหยุดทำงานก่อนเวลาอันควร
Version 1.89.0
เปลี่ยนแปลง
- ประสิทธิภาพเลเยอร์โมเดลวัตถุ Pdfium ของ
TPdf.ValidatePdfA: การท่องไปในหน้า/วัตถุในตอนนี้จะหยุดทำงานก่อนในสามระดับ — ลูปหน้าจะสิ้นสุดลงเมื่อพบปัญหาเลเยอร์ Pdfium ที่เกี่ยวข้องทั้งหมดแล้ว ลูประดับวัตถุจะสิ้นสุดลงเมื่อมีการตั้งค่าปัญหาของทั้งสองวัตถุ (การฝังฟอนต์ + ความโปร่งใส) และการสแกนอักขระหน้าข้อความจะข้ามการตรวจสอบ.notdefเมื่อเกิดปัญหาUnicodeMapErrorขึ้นแล้ว โดยการตรวจสอบความพร้อมใช้งานของ APIAssigned()และแฟลกความสอดคล้องจะถูกแคชเก็บไว้ในตัวแปรบูลีนท้องถิ่นหนึ่งครั้งก่อนเริ่มลูป แทนที่จะประเมินใหม่ในทุกหน้า/วัตถุ/อักขระ ส่งผลให้การท่องไปในเอกสารขนาดใหญ่ที่ไม่สอดคล้องตามข้อกำหนดสามารถหยุดลงได้หลังจากหน้าแรกแทนที่จะต้องสแกนทุกหน้า และสำหรับเอกสารที่สอดคล้องตามข้อกำหนด ค่าใช้จ่ายระบบต่อหน้าจะต่ำลง (ไม่มีการเรียกใช้Assignedซ้ำๆ)
Version 1.88.0
เพิ่มเติม
ValidatePdfXได้รับค่าTPdfXValidationIssueระดับเนื้อหาใหม่แปดค่าซึ่งครอบคลุมข้อจำกัดในการแลกเปลี่ยนสิ่งพิมพ์ที่ PDF/X กำหนดนอกเหนือจากตัวชี้วัดรูปแบบไฟล์:pvxiLzwForbidden(/LZWDecode),pvxiJavaScriptForbidden(/JavaScript),pvxiFormFieldsForbidden(/AcroForm//XFA),pvxiAdditionalActions(/AA),pvxiEmbeddedFilesForbidden(/EmbeddedFiles//FileAttachment),pvxiOpiForbidden(/OPI//Alternates),pvxiMissingTrimBox(ไม่มี/TrimBoxในหน้าใดๆเลย) และpvxiTrappedNotSet(ไม่มี/Trappedหรือระบุเป็น/Unknown) โดยก่อนหน้านี้ตัวตรวจสอบ PDF/X จะตรวจสอบเฉพาะตัวชี้วัด XMP/OutputIntent เท่านั้น และนี่ถือเป็นรอบการตรวจสอบระดับเนื้อหารอบแรก โดยมีการเพิ่มตัวช่วยร่วมPdfStructureBytes/PdfHasName/PdfCountNameไปยังFPdfPdfCommonเพื่อให้หน่วยตรวจสอบความสอดคล้องทั้งหมดสามารถใช้งานร่วมกันได้
Version 1.87.0
เพิ่มเติม
- การตรวจสอบ PDF/UA ครอบคลุมกฎฟอนต์แบบผสม (composite-font) ตาม ISO 14289-1 §7.21.3 แล้ว:
pvuaiCidSystemInfoMismatchตั้งค่าสถานะฟอนต์ Type0 ที่ CMap ที่ฝังอยู่และ CIDFont ลูกไม่ตรงกันในด้านRegistry/OrderingหรือSupplementของ CIDFont เกิน CMap,pvuaiCMapNotEmbeddedตั้งค่าสถานะ CMap ที่อ้างอิงด้วยชื่อ (ในฐานะEncodingหรือUseCMap) ซึ่งไม่ใช่ CMap ที่กำหนดไว้ล่วงหน้าตาม ISO 32000-1 Table 118 และpvuaiCMapWModeMismatchตั้งค่าสถานะ CMap ที่ฝังอยู่ซึ่งค่าWModeในพจนานุกรมแตกต่างจาก WMode ในเนื้อหาสตรีม
แก้ไข
- การตรวจสอบ §7.21.3.2
pvuaiCidFontMissingCidToGidMapพลาดพจนานุกรม CIDFontType2 ที่คู่ key/value ของSubtypeคั่นด้วยการขึ้นบรรทัดใหม่ และขณะนี้ยังตั้งค่าสถานะค่าชื่อCIDToGIDMapอื่นที่ไม่ใช่Identityด้วย
Version 1.86.0
เพิ่มเติม
- การตรวจสอบ PDF/UA ครอบคลุมกฎการเข้ารหัส TrueType ตาม ISO 14289-1 §7.21.6 แล้ว:
pvuaiTrueTypeEncodingInvalidตั้งค่าสถานะฟอนต์ TrueType ที่ไม่ใช่ symbolic ซึ่งขาดEncodingหรือค่าไม่ใช่MacRomanEncodingหรือWinAnsiEncoding(โดยตรงหรือผ่านBaseEncoding) และpvuaiSymbolicTrueTypeEncodingตั้งค่าสถานะฟอนต์ TrueType แบบ symbolic ที่มีชื่อEncodingที่ไม่เป็นมาตรฐาน
Version 1.85.1
เปลี่ยนแปลง
- การตรวจสอบ tab-order ตาม ISO 14289-1 §7.18.3 ของ
pvuaiMissingTabsOrderขณะนี้ทำงานทีละหน้า: ทุกหน้าที่มีคำอธิบายประกอบต้องประกาศ/Tabs /Sในพจนานุกรมหน้าของตัวเอง ดังนั้นหน้าที่สอดคล้องจะไม่ปิดบังหน้าที่ขาดการประกาศดังกล่าวอีกต่อไป
Version 1.85.0
เพิ่มเติม
- การตรวจสอบ PDF/UA ขณะนี้แยกแยะ XFA ฟอร์มแบบไดนามิกจากแบบสถิตตาม ISO 14289-1 §7.15:
pvuaiXfaDynamicตั้งค่าสถานะฟอร์มที่การกำหนดค่า XFA ตั้งค่าdynamicRenderเป็นrequired
เปลี่ยนแปลง
- ค่าสถานะ
pvuaiXfaPresentที่เคยใช้สำหรับตรวจ XFA ทุกประเภทถูกยกเลิกและจะไม่ถูกสร้างขึ้นอีกต่อไป (XFA แบบสถิตสอดคล้องกับ §7.15); ค่า enum ยังคงอยู่เพื่อความเข้ากันได้ของ API
Version 1.84.0
เพิ่มเติม
- การตรวจสอบ PDF/UA ขณะนี้ตรวจหาเนื้อหาจริงที่ไม่ได้แท็กตามที่ ISO 14289-1 §7.1 กำหนด:
pvuaiUntaggedContentตั้งค่าสถานะออบเจ็กต์ข้อความและภาพที่เรนเดอร์แล้วซึ่งไม่ถูกอ้างสิทธิ์โดยโครงสร้างต้นไม้ของหน้า (ผ่าน marked-content ID) และไม่ถูกทำเครื่องหมายเป็น Artifact - ตัวช่วยระดับหน้าใหม่
GetPageContentMarkInfosและValidatePdfUaPageContentTaggingพร้อม recordTPdfPageContentMarkInfoสำหรับใช้งานโดยตรง
Version 1.83.0
เพิ่มเติม
- การตรวจสอบ PDF/UA ขณะนี้บังคับใช้รูปแบบหัวเรื่องตาม ISO 14289-1 §7.4.4:
pvuaiHeadingModelMixedตั้งค่าสถานะเอกสารที่ใช้ tagHแบบทั่วไปปนกับหัวเรื่องหมายเลขH1..HnและpvuaiHeadingMultipleInNodeตั้งค่าสถานะโหนดโครงสร้างที่มีหัวเรื่องHมากกว่าหนึ่ง tag เป็น child
Version 1.82.0
เพิ่มเติม
- การตรวจสอบ PDF/UA ขณะนี้แก้ไข RoleMap ตามที่ ISO 14289-1 §7.1 กำหนด:
pvuaiRoleMapRemapsStandardตั้งค่าสถานะรายการ RoleMap ที่นิยาม structure type มาตรฐานใหม่ และpvuaiRoleMapUnresolvedตั้งค่าสถานะ structure type ที่ไม่เป็นมาตรฐานที่ถูกใช้งานซึ่งสาย RoleMap หายไป ขาดตอน หรือวนซ้ำ — สายทางอ้อมที่ถึง type มาตรฐานถือว่ายอมรับได้ และรายการ RoleMap ที่ไม่ถูกใช้จะไม่ถูกตัดสิน - ตัวช่วยใหม่
PdfUaIsStandardStructType,PdfReadRoleMapPairs(พร้อมการถอดรหัส escape ชื่อ PDF#hh) และValidatePdfUaRoleMapUsageสำหรับใช้งานโดยตรง
Version 1.81.0
เพิ่มเติม
- การตรวจสอบ PDF/UA ครอบคลุมการแท็กรายการตาม ISO 32000-1 ที่ ISO 14289-1 §7.6 กำหนด:
pvuaiListStructureInvalidตั้งค่าสถานะรายการ LI ที่อยู่นอก container L และส่วน Lbl/LBody ที่อยู่นอกรายการ LI ขณะที่ยอมรับรายการซ้อนและการใช้ Lbl ที่ถูกต้องภายในอิลิเมนต์ Note และ BibEntry
Version 1.80.0
เพิ่มเติม
- การตรวจสอบ PDF/UA ครอบคลุมการแท็กตารางตาม ISO 32000-1 ที่ ISO 14289-1 §7.5 กำหนด:
pvuaiTableStructureInvalidตั้งค่าสถานะเซลล์ TH/TD ที่อยู่นอกแถว TR และแถวหรือกลุ่มแถวที่อยู่นอก Table container,pvuaiTableHeaderMissingScopeตั้งค่าสถานะเซลล์ส่วนหัวที่ไม่สามารถระบุความสัมพันธ์ได้ทั้งผ่านแอตทริบิวต์ Scope หรือการเชื่อมโยง Headers/ID และpvuaiTableHeadersUndefinedIdตั้งค่าสถานะการอ้างอิง Headers ในเอกสารที่ไม่ได้กำหนด ID ขององค์ประกอบโครงสร้างไว้ TPdfStructureElementเปิดเผยแอตทริบิวต์ตารางScope,HasHeaders,HeadersIds,ColSpanและRowSpanซึ่งถูก resolve ระหว่างการท่องโครงสร้างต้นไม้
เปลี่ยนแปลง
- การท่องโครงสร้างต้นไม้ขณะนี้อ่านแอตทริบิวต์ layout และ table ทั้งหมดในรอบเดียวสำหรับพจนานุกรมแอตทริบิวต์ของแต่ละอิลิเมนต์แทนการสแกนครั้งละหนึ่งแอตทริบิวต์
Version 1.79.1
เพิ่ม
- พอร์ตตัวอย่าง
AnnotationsLabไปยัง Lazarus และ C++Builder โดยเข้าร่วมกับตัวอย่างคอนโซล Delphi ที่มีอยู่
แก้ไข
TPdf.CreateAnnotationอาจทำให้เกิดข้อผิดพลาด “Cannot set attachment points” สำหรับคำอธิบายประกอบแบบมาร์กอัปที่ใช้จุด quad (Highlight, Underline, StrikeOut, Squiggly) เนื่องจากคำอธิบายประกอบใหม่ยังไม่มีช่อง quad ให้แทนที่; ตอนนี้จะใช้วิธีต่อท้าย quad แรกแทน
Version 1.79.0
เพิ่ม
- ตัวอย่างคอนโซล Delphi ใหม่
AnnotationsLab: สร้างคำอธิบายประกอบแบบ Text, Highlight, Square และ Circle เขียนลงใน PDF จากนั้นโหลดไฟล์ซ้ำและแจกแจงรายการคำอธิบายประกอบในหน้า
Version 1.78.0
เพิ่ม
- ฟังก์ชันใหม่
TPdf.MeasureTextและTPdf.MeasureTextWidth: วัดความกว้างและความสูงของการเรนเดอร์สตริงสำหรับฟอนต์และขนาดที่กำหนด (หน่วยผู้ใช้ PDF, 1 หน่วย = 1/72 นิ้ว) โดยไม่ต้องเพิ่มเนื้อหาลงในหน้า ทำให้สามารถใช้ตรรกะเค้าโครงและการตัดคำบนAddTextได้; จัดทำโดยยูนิตแบบสแตนด์อโลนFPdfMeasureเป็นตัวช่วยคลาส - ฟังก์ชันใหม่
TPdf.WrapText: การตัดคำแบบ greedy ที่สร้างขึ้นจากMeasureTextWidthซึ่งจะแยกข้อความด้วยการเว้นวรรค และรวมคำเป็นบรรทัดที่มีความกว้างไม่เกินค่าที่กำหนด (หน่วยผู้ใช้ PDF); คำเดียวที่ยาวเกินไปจะถูกแยกไว้ในบรรทัดของตัวเอง (ไม่มีการแบ่งระหว่างคำ) และส่งกลับบรรทัดที่ตัดแล้วเป็นอาร์เรย์
Version 1.77.0
เพิ่ม
ValidatePdfAได้รับค่าTPdfAValidationIssueใหม่สามค่า ซึ่งครอบคลุมประโยคที่เคยวินิจฉัยไว้ว่า “NO” หรือ “reader behaviour” โดยการตรวจสอบช่องโหว่ก่อนหน้านี้ (ต่อท้ายค่าปกติ ลำดับเดิมไม่เปลี่ยนแปลง):pvaiPdfiumNotDefGlyph(PDF/A-2 6.2.11.8 — อักขระที่แปลงเป็น Unicode 0 โดยไม่มีข้อผิดพลาดในการจับคู่ ซึ่งเป็นอาการรันไทม์ของการอ้างอิงไกลฟ์ (glyph).notdef; ตรวจจับผ่านเลเยอร์ object-model ของ Pdfium),pvaiWordBreakMissing(ระดับ A 6.8.3.2 — สตริงแสดงในสตรีมเนื้อหาที่ยาวกว่า 20 อักขระและไม่มีช่องว่าง ซึ่งน่าจะละเมิดการรวมคำ; ใช้ฮิวริสติกแบบหยาบเพื่อหลีกเลี่ยงผลบวกลวงในกลุ่ม CJK) และpvaiLinkActionMissingTarget(6.6.3 — การทำงาน GoToR/URI/SubmitForm ที่ไม่มีคีย์เป้าหมายการแสดงผล ทำให้โปรแกรมอ่านไม่สามารถนำเสนอได้)
Version 1.76.0
เพิ่มแล้ว (Added)
ValidatePdfAได้เพิ่มค่าTPdfAValidationIssueใหม่สามค่า (เพิ่มต่อท้ายลำดับ ordinal โดยค่าเดิมไม่เปลี่ยนแปลง):pvaiNameNotValidUtf8(PDF/A-2/3 6.1.8 — โทเค็น/BaseFontหรือ/FontNameมีไบต์ ≥ 0x80 ที่ไม่เป็น UTF-8 ที่ถูกต้อง),pvaiInlineImageLzwForbidden(PDF/A-2/3 6.1.10 — ภาพอินไลน์ใน page content stream ใช้ตัวกรอง LZW หรือ Crypt) และpvaiTrueTypeDifferencesForbidden(6.3.7 Cor.2 — ฟอนต์ TrueType แบบ non-symbolic ที่พจนานุกรม Encoding ของมันมี/Differences)
Version 1.75.0
เพิ่มเติม (Added)
ValidatePdfAได้รับค่าTPdfAValidationIssueใหม่ 3 ค่า (ต่อท้ายลำดับ ค่าที่มีอยู่เดิมไม่มีการเปลี่ยนแปลง):pvaiIntegerImplementationLimit(PDF/A-2/3 6.1.13 — โทเค็นตัวเลขที่เกินขีดจำกัดจำนวนเต็มที่มีเครื่องหมาย 32 บิต 2,147,483,647),pvaiBlendModeNotWhitelisted(PDF/A-2/3 6.2.10 — ค่า/BMที่อยู่นอกเหนือชุดเบลนด์โหมดมาตรฐาน ISO 32000-1 §11.3.5; เติมเต็มpvaiTransparentColorSpaceของ PDF/A-1 ซึ่งอนุญาตเฉพาะ Normal/Compatible), และpvaiHexStringOddDigits(6.1.6 — สตริงฐานสิบหก<...>ที่มีจำนวนหลักฐานสิบหกเป็นจำนวนคี่)
Version 1.74.0
เพิ่มเติม (Added)
ValidatePdfAได้รับค่าTPdfAValidationIssueใหม่ 3 ค่า (ต่อท้ายลำดับ ค่าที่มีอยู่เดิมไม่มีการเปลี่ยนแปลง):pvaiPermissionsViolation(6.1.12 — พจนานุกรม/Permsที่มี/DigestLocation,/DigestMethodหรือ/DigestValueควบคู่ไปกับ/DocMDP),pvaiTransActionForbidden(PDF/A-2 6.5.1 — การกระทำช่วงเปลี่ยนผ่านแบบ Trans ถูกตรวจจับผ่านรูปแบบ action-dict/S /Transเพื่อหลีกเลี่ยงการจับคู่ผิดพลาดกับ/Transparency), และpvaiPdfiumObjectTransparency(PDF/A-1 6.4 — ออบเจ็กต์หน้ามีความโปร่งใสจริงตามFPDFPageObj_HasTransparencyซึ่งขยายการทำงานของชั้นออบเจ็กต์โมเดลของ Pdfium ที่เพิ่มเข้ามาใน v1.73.0 เพื่อดักจับเอฟเฟกต์เบลนด์โหมด/ซอฟต์มาสก์ที่การสแกนระดับไบต์อาจพลาดไป)
Version 1.73.0
เพิ่มเติม (Added)
TPdf.ValidatePdfAตอนนี้ได้เพิ่มเลเยอร์การตรวจสอบออบเจ็กต์โมเดลของ Pdfium ทับบนตัวตรวจสอบระดับไบต์: โดยจะเดินตรวจสอบออบเจ็กต์ข้อความของทุกหน้าผ่านFPDFPage_GetObject→FPDFTextObj_GetFont→FPDFFont_GetIsEmbeddedและรายงานฟอนต์ที่เรนเดอร์แต่ไม่ได้ฝังเป็นpvaiPdfiumFontNotEmbedded(ISO 19005 6.3.4), และโหลดหน้าข้อความแต่ละหน้าเพื่อสแกนFPDFText_HasUnicodeMapErrorและรายงานการแมป Unicode ที่เสียหายเป็นpvaiPdfiumUnicodeMapError(6.3.8) สิ่งเหล่านี้คือการตรวจสอบที่ตัวตรวจสอบระดับไบต์ไม่สามารถทำได้ — เนื่องจากมองเห็นเพียงโทเค็นชื่อ ไม่ใช่แฮนเดิลฟอนต์ที่ได้รับการแก้ไขแล้วหรือสถานะการแมปทีละตัวอักษร — และนำผลลัพธ์มารวมไว้กับผลลัพธ์ระดับไบต์ ฟังก์ชันระดับไบต์ValidatePdfAComplianceแบบสแตนด์อะโลนไม่มีการเปลี่ยนแปลง
Version 1.72.0
เพิ่มเติม (Added)
ValidatePdfAได้รับค่าTPdfAValidationIssueใหม่ 5 ค่า (ต่อท้ายลำดับ ค่าที่มีอยู่เดิมไม่มีการเปลี่ยนแปลง):pvaiNeedsRenderingPresent(PDF/A-2 6.4.2 — แค็ตตาล็อกจะต้องไม่มี/NeedsRendering),pvaiDestOutputProfileRef(PDF/A-3 6.2.3 — OutputIntent จะต้องไม่มี/DestOutputProfileRef),pvaiEmbeddedFileMissingUF(PDF/A-3 6.8 — ข้อกำหนดไฟล์ที่มี/EFจะต้องมี/UFด้วย),pvaiXmpPacketBytesAttr(6.7.5 — ส่วนหัวแพ็กเก็ต XMP จะต้องไม่มีแอททริบิวต์bytes=หรือencoding=ที่ถูกเลิกใช้งานแล้ว), และpvaiAnnotationToggleNoView(PDF/A-2 6.3.2 — ไม่อนุญาตให้ใช้บิต ToggleNoView/Fของคำอธิบายประกอบ ค่า 512)
Version 1.71.0
เปลี่ยนแปลง
ValidatePdfUaตอนนี้จะสร้างข้อผิดพลาดpvuaiOrderedListMissingListNumbering(ISO 14289-1 7.6): ตัวท่องโครงสร้างต้นไม้ (structure-tree walker) จะทำการระบุแอททริบิวต์เค้าโครงListNumberingในทุกอิลิเมนต์Lผ่าน API แอททริบิวต์ของ Pdfium และตั้งค่าสถานะ (flag) ค่าใดๆ ที่อยู่นอกชุดข้อมูล ISO 32000-1 ตาราง 347 (Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha,None,Circle,Disc,Square) หากไม่มีแอททริบิวต์จะไม่ถูกตั้งค่าสถานะ เนื่องจากรายการอาจไม่มีลำดับ (unordered) สิ่งนี้ปิดช่องว่างที่เหลือของ ISO 14289-1 ที่บันทึกไว้ในตอนท้ายของรอบที่ 5
Version 1.70.0
เพิ่มเติม
ValidatePdfUaได้รับค่าTPdfUaValidationIssueใหม่ 4 ค่า (ต่อท้ายลำดับ ค่าที่มีอยู่เดิมไม่มีการเปลี่ยนแปลง):pvuaiSubsetMissingCidSet(ISO 14289-1 7.21.4.2 — ชุดย่อย CID ของFontDescriptorจะต้องประกาศ/CIDSet),pvuaiToUnicodeForbiddenValue(7.21.7 — ToUnicode CMap จะต้องไม่แมปโค้ดใดๆ ไปยังU+FEFFหรือU+FFFEสตรีมที่ไม่ถูกบีบอัดจะถูกสแกนหารูปแบบผลลัพธ์<FEFF>/<FFFE>),pvuaiLangInvalidFormat(7.2 —/Langจะต้องเป็นแท็ก RFC 1766 / BCP 47 ที่ถูกต้อง โดยยอมรับไวยากรณ์อย่างผ่อนปรน เช่นen,en-US,zh-Hans,es-419และตั้งค่าสถานะค่าที่ผิดรูปแบบอย่างชัดเจน), และpvuaiOrderedListMissingListNumbering(7.6 — เก็บไว้เพื่อความสมบูรณ์ของ API แต่ตัวตรวจสอบยังไม่สร้างข้อผิดพลาดนี้ เนื่องจากการแยกลิสต์แบบมีลำดับและไม่มีลำดับอย่างน่าเชื่อถือจำเป็นต้องใช้ค่าแอททริบิวต์ListNumberingซึ่งตัวท่องโครงสร้างต้นไม้ไม่ได้เปิดเผย)
Version 1.69.0
เพิ่มเติม
ValidatePdfUaได้รับค่าTPdfUaValidationIssueใหม่ 2 ค่า (ต่อท้ายลำดับ ค่าที่มีอยู่เดิมไม่มีการเปลี่ยนแปลง):pvuaiWidgetOutsideForm(ISO 14289-1 7.18.4 — อิลิเมนต์โครงสร้าง Widget จะต้องซ้อนอยู่ภายในอิลิเมนต์Formตัวท่องโครงสร้างต้นไม้ตอนนี้จะตรวจสอบชนิดของพาเรนต์โดยตรงของแต่ละ Widget) และpvuaiSubsetMissingCharSet(7.21.4.2 — ชุดย่อย Type 1FontDescriptorจะต้องประกาศ/CharSetซึ่งระบุโดยคำนำหน้าชื่อชุดย่อยขนาด 6 ตัวอักษร+บน/FontName)
Version 1.68.0
เพิ่มเติม
ValidatePdfUaได้รับค่าTPdfUaValidationIssueใหม่ 2 ค่า (ต่อท้ายลำดับ ค่าที่มีอยู่เดิมไม่มีการเปลี่ยนแปลง):pvuaiUriActionIsMap(ISO 14289-1 7.18.5 — พจนานุกรมการกระทำ URI จะต้องไม่มี/IsMapเป็นค่าtrueเนื่องจากเป็นการปิดใช้งานเป้าหมายลิงก์ที่เข้าถึงได้) และpvuaiHeadingSequenceViolation(7.4.2 — หัวเรื่องที่มีการกำหนดตัวเลขจะต้องเริ่มต้นที่H1และลำดับจากมากไปน้อยจะต้องไม่ข้ามระดับที่อยู่ตรงกลาง ตัวอย่างเช่นH1→H3ถือเป็นการละเมิด) การตรวจสอบหัวเรื่องนี้เป็นกฎ PDF/UA ระดับโครงสร้างต้นไม้ข้อแรกในตัวตรวจสอบ: ตอนนี้ValidatePdfUaStructureElementsจะท่องไปยังรายการอิลิเมนต์ที่ระบุชนิดและตรวจสอบลำดับของH1…H6(และH7+ตาม 7.4.3) ตามลำดับในเอกสาร
Version 1.67.0
เพิ่มเติม
ValidatePdfUaได้รับค่าTPdfUaValidationIssueใหม่ 5 ค่า (ต่อท้ายลำดับ ค่าที่มีอยู่เดิมไม่มีการเปลี่ยนแปลง):pvuaiLinkMissingContents(ISO 14289-1 7.18.5 — คำอธิบายประกอบของ Link จะต้องมีคำอธิบายทางเลือกผ่าน/Contents),pvuaiAnnotationMissingContents(7.18.1 — คำอธิบายประกอบที่ไม่ได้รับการยกเว้นใดๆ ที่ไม่มี/Contentsจะต้องมีคำอธิบายทางเลือก ซึ่ง Popup และ Widget ได้รับการยกเว้น),pvuaiEmbeddedFileMissingName(7.11 — พจนานุกรมข้อกำหนดไฟล์จะต้องมี/Fและ/UF),pvuaiMediaClipMissingAlt(7.18.6.2 — พจนานุกรมข้อมูลคลิปสื่อจะต้องมี/CTและ/Alt), และpvuaiCidFontMissingCidToGidMap(7.21.3.2 — CIDFont ประเภทที่ 2 ที่ฝังอยู่จะต้องมี/CIDToGIDMap)
Version 1.66.0
เพิ่มเติม
ValidatePdfUaได้รับค่าTPdfUaValidationIssueใหม่ 5 ค่า (ต่อท้ายลำดับ ค่าที่มีอยู่เดิมไม่มีการเปลี่ยนแปลง):pvuaiRoleMapMissing(ISO 14289-1 7.1 — เอกสารที่ถูกแท็กพร้อมชนิดโครงสร้างที่ไม่เป็นมาตรฐานจะต้องมี/RoleMap),pvuaiOptionalContentAsKey(7.10 — พจนานุกรมการตั้งค่าคอนเทนต์ทางเลือกจะต้องไม่มีคีย์สถานะอัตโนมัติ/AS),pvuaiXfaPresent(7.15 — การมีอยู่ของ AcroForm/XFAจะถูกตั้งค่าสถานะเนื่องจากไม่อนุญาตให้ใช้ XFA แบบไดนามิก),pvuaiTrapNetAnnotation(7.18.2 — ไม่อนุญาตให้ใช้คำอธิบายประกอบ/TrapNet), และpvuaiReferenceXObject(7.20 — Reference XObjects ที่มีคีย์ปิดที่เครื่องหมาย/Refจะไม่ได้รับอนุญาตให้ใช้งาน)
แก้ไข
ValidatePdfUaจะไม่รายงานpvuaiEncryptionPresentผิดพลาดแบบผลบวกลวงในทุกไฟล์ที่เข้ารหัสอีกต่อไป: PDF/UA อนุญาตให้เข้ารหัสได้ตราบใดที่คีย์/Pของพจนานุกรมการเข้ารหัสถูกตั้งค่าบิตตำแหน่งที่ 10 (ค่า 1024) ไว้ ซึ่งอนุญาตให้เทคโนโลยีช่วยเหลือสามารถเข้าถึงได้ (7.16) การละเมิดที่แน่ชัดในขณะนี้จะถูกรายงานผ่านpvuaiEncryptionPBitMissingใหม่;pvuaiEncryptionPresentยังคงอยู่ใน enum เพื่อความเข้ากันได้ของ API แต่จะไม่ถูกสร้างข้อผิดพลาดโดยตัวตรวจสอบระดับไบต์อีกต่อไป
Version 1.65.0
เพิ่มเติม
ValidatePdfAได้รับค่าTPdfAValidationIssueใหม่ 5 ค่า (ต่อท้ายลำดับ ค่าที่มีอยู่เดิมไม่มีการเปลี่ยนแปลง):pvaiCidFontMissingCidToGidMap(ISO 19005-1 6.3.3.2 Cor.2 — CIDFont ประเภทที่ 2 ที่ฝังอยู่จะต้องมี/CIDToGIDMap),pvaiSubsetMissingCharSet(6.3.5 — ชุดย่อย Type 1FontDescriptorจะต้องมี/CharSet),pvaiSubsetMissingCidSet(6.3.5 — ชุดย่อย CID ของFontDescriptorจะต้องมี/CIDSet),pvaiWidgetActionForbidden(6.6.1 — คำอธิบายประกอบของ Widget จะต้องไม่มี/Aหรือ/AA), และpvaiOptionalContentAsKey(ISO 19005-2 6.9 — พจนานุกรมการตั้งค่าคอนเทนต์ทางเลือกจะต้องไม่มีคีย์สถานะอัตโนมัติ/ASซึ่งมีความเกี่ยวเนื่องใหม่เนื่องจาก PDF/A-2 อนุญาตคอนเทนต์ทางเลือก)
Version 1.64.0
เพิ่มเติม
ValidatePdfAได้รับค่าTPdfAValidationIssueใหม่ 8 ค่า (ต่อท้ายลำดับ ค่าที่มีอยู่เดิมไม่มีการเปลี่ยนแปลง):pvaiHeaderBinaryMarkerMissing(ISO 19005-1 6.1.2 — ส่วนหัว%PDF-x.yจะต้องตามด้วยความคิดเห็น%ที่มีไบต์อย่างน้อยสี่ไบต์ที่มีค่ามากกว่า 127),pvaiExternalStreamRef(6.1.7 — พจนานุกรมสตรีมจะต้องไม่มี/F,/FFilterหรือ/FDecodeParms),pvaiOutputIntentScheme(6.2.2 —/Sของ OutputIntent จะต้องเป็น/GTS_PDFA1),pvaiInfoXmpDateMismatch(6.7.3 — ข้อมูลCreationDate/ModDateจะต้องแสดงเป็นxmp:CreateDate/xmp:ModifyDateด้วย),pvaiMarkInfoMissing(6.8.2.2 — Level A ต้องการ/MarkInfoที่มี/Marked true),pvaiAnnotationApDictViolation(6.5.3 Cor.2 — พจนานุกรม/APของคำอธิบายประกอบจะต้องมีแค่/N),pvaiEmbeddedFileMissingAFRelationship(ISO 19005-3 Annex E.2 — ข้อกำหนดไฟล์ที่เกี่ยวข้องแต่ละไฟล์จะต้องมี/AFRelationship), และpvaiJpeg2000Violation(ISO 19005-2 6.2.8.3 — รูปภาพ JPEG2000 จะต้องประกาศ 1, 3 หรือ 4 คอมโพเนนต์)
แก้ไข
ValidatePdfAจะไม่รายงานpvaiAnnotationFlagsViolationผิดพลาดแบบผลบวกลวงในเอกสารที่ใช้ชื่อทรัพยากรฟอนต์เป็นตัวอักษรเดียว เช่น/Font << /F 5 0 R >>อีกต่อไป; การสแกนตั้งค่าสถานะ/Fตอนนี้จะถูกจำกัดบริบทให้อยู่ในคำอธิบายประกอบ (/Subtypeของชนิดคำอธิบายประกอบ) ซึ่งสอดคล้องกับพฤติกรรมที่บันทึกไว้ในเอกสาร (6.5.3)ValidatePdfAตอนนี้รายงานความต้องการไฟล์ที่เกี่ยวข้องของ PDF/A-3 ตามแต่ละไฟล์: เอกสารจะถูกตั้งค่าสถานะก็ต่อเมื่อ/Type /Filespecที่ฝังอยู่ซึ่งอ้างอิงสตรีมที่ฝังอยู่ผ่าน/EFขาด/AFRelationshipแทนที่จะเป็นการตรวจสอบทั้งหมดหรือไม่มีเลยในระดับเอกสารแบบเดิม (ISO 19005-3 Annex E.2)- เพิ่มการกระทำที่เลิกใช้แล้ว (deprecated)
/SetStateไปยังชุดข้อมูลการกระทำที่ไม่อนุญาตควบคู่ไปกับ/SetOCGStateดังนั้นชื่อการกระทำที่อ้างอิงใน PDF จะถูกตรวจจับโดยตรง (6.6.1)
Version 1.63.0
เพิ่มเติม (เพิ่มเติม)
- เพิ่ม
TPdf.MeasureTextและTPdf.MeasureTextWidth: วัดความกว้างและความสูงที่เรนเดอร์จริงของข้อความในฟอนต์และขนาดที่กำหนด โดยไม่เพิ่มเนื้อหาลงในหน้า (หน่วย PDF user units, 1 unit = 1/72 นิ้ว) รองรับการคำนวณเลย์เอาต์และการตัดบรรทัดอัตโนมัติบนAddText; จัดให้โดย unit แบบ standaloneFPdfMeasureในรูปแบบ class helper
เปลี่ยนแปลง (เปลี่ยนแปลง)
- ปรับปรุงเดโม
Demo\Delphi\MergePDF,Demo\CBuilder\MergePDF,Demo\Lazarus\MergePDFสำหรับ IDE ทั้งสามตัว: รองรับการกำหนดช่วงหน้าแต่ละไฟล์, เส้นทางผลลัพธ์แบบกำหนดเอง, การตัดข้อมูลซ้ำ, บันทึกการทำงาน, ปุ่มยกเลิก, สรุปการรวมเอกสาร; บุ๊กมาร์กและเมทาดาตาจากแหล่งข้อมูลแรก - เดโม CreatePDF ทุก IDE รองรับตัวเลือก European Text สำหรับข้อความที่มีอักขระพิเศษภาษาเช็ก ฝรั่งเศส เยอรมัน สเปน โปรตุเกส โปแลนด์ และตุรกี เพื่อตรวจสอบการเลือกฟอนต์และการจัดการ Unicode (รวม EuropeanText เดิมเข้าไว้แล้ว)
- นำ
ExtractTextPagesและEuropeanTextออกแล้ว: การดึงข้อความทีละหน้าครอบคลุมโดยตัวเลือกช่วงหน้า/ตัวคั่นในExtractText; การเรนเดอร์หลายภาษา EuropeanText รวมเข้าใน CreatePDF แล้ว
Version 1.62.2
แก้ไขแล้ว (แก้ไข)
- สร้างส่วนหัว C++Builder (
.hpp) ใหม่สำหรับ RAD Studio ทุกเวอร์ชันและทุกแพลตฟอร์ม (Win32/Win64/Win64x); ส่วนหัวเหล่านี้คลาดเคลื่อนจากซอร์ส Pascal ทำให้ลายเซ็นฟังก์ชันเก่าและ unit ที่ขาดหายถูกส่งถึงผู้ใช้ C++Builder ผ่านชุดแจกจ่ายซอร์ส
Version 1.62.1
แก้ไขแล้ว (แก้ไข)
- กู้คืนการคอมไพล์ซอร์สบน RAD Studio 12 Athens และเวอร์ชันก่อนหน้า: การกำหนดค่า
TArray<Byte>ในเส้นทางตรวจสอบ PDF/UA ใช้การแปลงอาร์เรย์แบบ implicit ที่มีเฉพาะใน Delphi 13 จึงคอมไพล์ไม่ผ่านใน IDE รุ่นเก่า
Version 1.62.0
เพิ่มแล้ว (เพิ่มเติม)
TPdf.RenderPageThumbnailเรนเดอร์หน้าใดก็ได้ตาม index เป็น bitmap ที่ปรับตามอัตราส่วนภาพ โดยไม่เปลี่ยนหน้าปัจจุบันของเอกสาร หน้าที่โหลดอยู่ หรือเรียกOnPageChange
แก้ไขแล้ว (แก้ไข)
TPdfThumbnailViewไม่ควบคุมPageNumberของเอกสาร host ระหว่างการวาดอีกต่อไป; ก่อนหน้านี้ repaint แต่ละครั้งจะโหลดหน้าใหม่ เรียกOnPageChangeและทิ้ง text page ซึ่งอาจรบกวนTPdfViewที่เชื่อมอยู่และทำให้เกิดลูป repaint ตอนนี้ thumbnails เรนเดอร์ผ่านRenderPageThumbnailโดยไม่มีผลข้างเคียงเหล่านี้- การตรวจสอบความสอดคล้อง PDF/X ตอนนี้ตรวจเอกสารที่มี cross-reference streams (PDF 1.6 ซึ่งพบได้ทั่วไปใน PDF/X-4) และ object ที่เก็บใน compressed object streams แทนการรายงานไฟล์เหล่านี้ทั้งไฟล์ว่าไม่สอดคล้อง; marker
GTS_PDFXVersionถูกอ่านทั้งจาก element-form และ RDF attribute-form ใน XMP - การตรวจสอบ PDF/R ตอนนี้รายงาน
pvriInfoXmpMismatchเมื่อ Info dictionary และ XMP ไม่ตรงกันใน Producer หรือ Creator; ก่อนหน้านี้ issue นี้ถูกประกาศไว้แต่ไม่เคยถูกรายงาน - timer ของ form-fill ถูกติดตามแยกตามคำขอ ดังนั้นเอกสารที่รัน timer หลายตัวพร้อมกัน (เช่น JavaScript interval ควบคู่กับการกะพริบของ field caret) จะเก็บไว้ครบทุกตัว แทนที่จะสูญเสียทุกตัวเหลือเพียงตัวล่าสุด
- การวาดของ
TPdfViewและเมธอด publicRenderPage/RenderTileตอนนี้ถือ document render lock และจัดลำดับกับ worker-thread rendering ของTPdfเดียวกัน (PDFium ไม่ใช่ thread-safe) - ข้อความ non-ASCII ที่เขียนลงใน metadata ของ PDF/X, PDF/R และ PDF/VT (ชื่อเงื่อนไข OutputIntent, Creator, Producer) ตอนนี้เข้ารหัสเป็นสตริง UTF-16BE ตาม ISO 32000-1 §7.9.2.2 แทน raw UTF-8 ซึ่ง reader ที่สอดคล้องจะอ่านผิด
- helper ด้านความสอดคล้องอ่าน embedded metadata streams ที่
/Lengthเป็น indirect reference ได้ถูกต้อง โหลด source bytes ด้วยReadBuffer(เพื่อให้ short read ล้มเหลวอย่างสะอาด) และปฏิเสธ offsetstartxrefที่เป็นลบแทนการเสี่ยงอ่านนอกช่วง
Version 1.61.0
เปลี่ยนแปลง (เปลี่ยนแปลง)
- การแก้ไขคำประกาศ FFI/ABI ซึ่งอาจทำให้ต้องคอมไพล์โค้ดที่ใช้งาน callbacks ที่ได้รับผลกระทบใหม่: callback form-fill
FFI_OpenFileตอนนี้ใช้cdecl(Win32 stack convention) และพารามิเตอร์valueของFPDFAnnot_SetStringValueกับFPDFAttachment_SetStringValueเป็นFPDF_WIDESTRING(UTF-16LE) แล้ว เพื่อให้ตรงกับ header ของ PDFium - callbacks ของ progressive-load
FX_FILEAVAIL.IsDataAvailและFX_DOWNLOADHINTS.AddSegmentตอนนี้รับ offset แบบsize_tและsize_tมีขนาดเท่าพอยน์เตอร์บน Free Pascal / Lazarus Win64 (ก่อนหน้านี้ถูกตัดเหลือ 32 บิต) ซึ่งช่วยแก้การเรียก API ด้าน data-availability และoutsize_tบน FPC Win64
แก้ไขแล้ว (แก้ไข)
- ความปลอดภัยของหน่วยความจำ: use-after-free ของ timer form-fill เมื่อทำลาย
TPdfที่ยังมี AcroForm caret ทำงานอยู่; การเรียกFPDF_CloseDocumentซ้ำสองครั้งในเส้นทาง error ของImportNPagesToOne; exceptions ของ Pascal หลุดออกจาก callbacksFPDF_FILEWRITE/FPDF_FILEACCESSข้ามขอบเขต C ระหว่างการ save และ insert JPEG; และ integer overflow ในการแยกข้อความเมื่ออ่านจาก start index ไปจนถึงท้ายหน้า TPdfFuture<T>ตอนนี้ส่ง result callback ได้อย่างเชื่อถือ; ก่อนหน้านี้ reply มักถูกทิ้งเกือบตลอดเวลา และอาจแตะ thread ที่ถูก free ไปแล้ว เพราะ worker free ตัวเองก่อนที่ queued reply จะทำงาน- เอาต์พุต PDF/A, PDF/X, PDF/E, PDF/R, PDF/VT และ PDF/UA ตอนนี้เขียน cross-reference entries ที่มีขนาด 20 bytes พอดีตามที่ ISO 32000-1 §7.5.4 กำหนด
- การ inject standards marker ไม่ทำลาย dictionary อีกต่อไปเมื่อ key ที่ถูกลบ เช่น
/Trappedเป็นรายการสุดท้าย ซึ่งก่อนหน้านี้จะกลืน>>ที่ปิดท้ายและสร้าง object ที่ผิดรูป - สตรีม ICC profile ของ OutputIntent ตอนนี้ประกาศจำนวน component
/Nที่จำเป็นสำหรับ PDF/X และ PDF/VT (มีอยู่แล้วสำหรับ PDF/A) และเอกสารต้นทางที่เข้ารหัสจะถูกถอดรหัสก่อน inject markers ของ PDF/X, PDF/E, PDF/R, PDF/VT และ PDF/UA เพื่อให้ผลลัพธ์ถูกต้องแทนที่จะเสียหายแบบเงียบ ๆ - BOM ของ xpacket UTF-8 ใน XMP ที่สร้างขึ้นถูกปล่อยเป็นไบต์ตรงตามจริง แก้การเสียหายบนการติดตั้ง Delphi ที่ ANSI code page ไม่ใช่ Latin-1 และ incremental-update trailers ตอนนี้เก็บ reference
/Infoของเอกสารไว้ SaveAsที่ใช้การบีบอัดจะไม่ตัด stream ที่/Lengthเป็น indirect reference อีกต่อไป และ cross-reference tables ที่สร้างใหม่ตอนนี้ใช้ entries ขนาด 20 bytes, generation numbers จริง และตัด pointer/Prevที่ล้าสมัยทิ้ง- การตรวจสอบความสอดคล้องอ่าน version markers ของ XMP แบบ attribute-form สำหรับ PDF/E และ PDF/X ได้แล้ว จึงรู้จักไฟล์ PDF/X-4 ที่ serialize แบบ attribute, ต้องมี identifier
PDF/E-1แบบตรงตัว, อ่าน metadata streams ที่มี/Lengthเป็น indirect ได้ถูกต้อง, และไม่จับคู่ key/IDหรือ/StructTreeRootของ structure element ผิดอีกต่อไปเมื่อตรวจ PDF/UA trailer; offsetstartxrefที่ผิดรูปจะไม่ทำให้เกิด range error อีกต่อไป TPdfThumbnailView: หน้าสุดท้ายเข้าถึงได้ด้วย scroll bar แล้ว, หน้าปัจจุบันของ host document ถูกคืนกลับหลังจากวาด thumbnails และการจัดการ mouse-leave มาตรฐานถูกส่งอีกครั้ง- bitmaps ของหน้าและรูปภาพแบบ grayscale จะไม่ถูกเรนเดอร์ด้วย palette ผิดอีกต่อไป;
TPdfViewจะไม่เหลือ dangling reference เมื่อTPdfของมันถูก free ก่อน - รายงาน preflight: HTML ถูกบันทึกเป็น UTF-8 ให้ตรงกับ charset ที่ประกาศไว้ และการ escape string ของ JSON สร้างลำดับ
\uที่ถูกต้องสำหรับอักขระ non-ASCII บน Free Pascal - บิลด์ trial: กล่องโต้ตอบเตือน trial จะแสดงขึ้นแล้ว แทนที่จะถูก suppress ก่อนจะได้แสดง
TPdfStreamAdapterตอนนี้ปฏิเสธ streams ที่ใหญ่กว่า 4 GiB พร้อม error ชัดเจน แทนการตัด length ที่ส่งไปยัง PDFium โดยเงียบ ๆ
Version 1.60.1
เปลี่ยนแปลง (เปลี่ยนแปลง)
- เดโม AccessibilityReader สำหรับ Delphi, Lazarus และ C++Builder ตอนนี้รันการอ่านออกเสียงบน
TPdfReadingSession: แต่ละหน้าถูกประกอบเป็นชิ้นส่วนเสียงหนึ่งชิ้นด้วยBuildSpokenTextFromWords, ตำแหน่งคำจาก SAPI ป้อนเข้าFeedSpokenPosition, และเซสชันจะเลื่อนไปหน้าถัดไปพร้อมขับเคลื่อนเคอร์เซอร์คำของมุมมอง แทนการจัดการลำดับงานที่เขียนเองซึ่งแต่ละเดโมเคยมีมาก่อน - การติดตามคาราโอเกะระดับคำในเดโมตอนนี้ทำงานได้เมื่อใช้ NVDA เป็นเอนจินเสียงด้วย:
EstimatePacingปรับจังหวะเคอร์เซอร์การอ่านตามเวลาการพูดที่ผ่านไป ในขณะที่ก่อนหน้านี้ NVDA อ่านออกเสียงโดยไม่มีการติดตามคำเลย - Pause และ Resume ในเดโมตอนนี้ทำงานกับ NVDA ได้เช่นกัน:
ResumeRestartsChunkอ่านหน้าปัจจุบันซ้ำจากจุดเริ่มต้นเมื่อ Resume ในขณะที่ SAPI ยังคงใช้การหยุดชั่วคราวและการกลับมาทำงานต่อแบบเดิมภายในตำแหน่งเดิม
Version 1.60.0
เพิ่มแล้ว (เพิ่มเติม)
- การเรนเดอร์แบบใช้งานจริงสำหรับผู้ใช้สายตาเลือนรางบน
TPdfView: ตัวเลือกการเรนเดอร์ใหม่reInvertและreNightDuotoneจะปรับสีทุกไทล์ของหน้าที่เรนเดอร์แล้วแบบเรียลไทม์ (กลับสีเต็มรูปแบบหรือพาเล็ตดูโอโทนสำหรับโหมดกลางคืน) ก่อนวาดโอเวอร์เลย์ของการค้นหา การเลือก การอ่าน และเคอร์เซอร์คำ ทำให้ตัวแปลงสีบิตแมปที่มีอยู่ถูกนำมาใช้ในตัวแสดงแบบโต้ตอบทั้งเลย์เอาต์หน้าเดี่ยวและหน้าคู่; การสลับตัวเลือกจะรีเพนต์ทันที NightDuotoneInkและNightDuotonePaperกำหนดพาเล็ตโหมดกลางคืน โดยค่าเริ่มต้นเป็นข้อความสีอำพันบนหน้าสีดำ; ถ้าเปิดทั้งสองตัวเลือกreInvertจะมีผลก่อน
Version 1.59.0
เพิ่มแล้ว (เพิ่มเติม)
TPdfReadingSession: คอมโพเนนต์จัดการการอ่านออกเสียงที่เป็นกลางต่อเอนจินเสียง คอมโพเนนต์นี้รักษาเคอร์เซอร์ของชิ้นส่วน เคอร์เซอร์ของคำ และสถานะการเล่น (Play/PlayFrom/Pause/Resume/Stop) ไล่ผ่านชิ้นส่วนTPdfSpokenTextที่โหลดไว้เมื่อโฮสต์รายงานว่าเอนจินว่างผ่านTickแปลงตำแหน่งข้อความที่พูดกลับเป็นอักขระบนหน้า และขับเคลื่อนเคอร์เซอร์คำของTPdfViewที่แนบอยู่โดยอัตโนมัติ; โฮสต์เชื่อมต่อเอนจินเสียงใดก็ได้ผ่านOnSpeakและอีเวนต์ร้องขอ cancel / pause / resume ดังนั้นไลบรารีจึงไม่ลิงก์ API เสียงใดโดยตรงFeedSpokenPositionรับตำแหน่งคำจากเอนจินพูดออกเสียง (เช่น SAPIStatus.InputWordPosition);EstimatePacingร่วมกับEstimatedWordsPerMinuteใช้กำหนดจังหวะให้เอนจินที่ไม่มีสัญญาณตำแหน่ง;ResumeRestartsChunkพูดชังก์ปัจจุบันซ้ำสำหรับเอนจินที่ไม่มีการหยุดชั่วคราวแบบเนทีฟOnChunkChange,OnWordChangeและOnFinishedจะทำงานเฉพาะเมื่อมีการเปลี่ยนแปลงจริง และมุมมองที่แนบอยู่ซึ่งถูก free แล้วจะถอดการเชื่อมต่อของตัวเองโดยอัตโนมัติ ทำให้โค้ดฝั่งโฮสต์ไม่มีอาการกะพริบและปลอดภัยจากการแครช
Version 1.58.0
เพิ่มแล้ว (เพิ่มเติม)
EstimateSpokenWordIndexประมาณว่าขณะนั้นเอนจินพูดออกเสียงคำใดจากเวลาที่ผ่านไปและอัตราคำต่อนาที โดยให้คำที่ยาวได้เวลามากขึ้นตามสัดส่วน จึงทำให้เอนจินที่ไม่รายงานตำแหน่งคำ (เช่น NVDA controller client) ยังขับเคลื่อนเคอร์เซอร์การอ่านระดับคำได้; ผู้เรียกเป็นผู้ส่งเวลาที่ผ่านไปมาให้ จึงไม่มีการผูกกับนาฬิกาและทดสอบแบบหน่วยได้
Version 1.57.0
เพิ่มแล้ว (เพิ่มเติม)
- การประกอบข้อความที่พูดพร้อมการแมปสองโดเมนสำหรับการติดตามการอ่านออกเสียง:
BuildSpokenTextFromWordsและSpokenTextAppendสร้างสตริงที่ส่งให้เอนจิน text-to-speech จาก word box ของหน้า พร้อมบันทึกตาราง span และSpokenToPageCharแปลงออฟเซ็ตที่เอนจินรายงานจากข้อความที่พูด (เช่น SAPIStatus.InputWordPosition) กลับไปยังดัชนีอักขระบนหน้า เพื่อให้การติดตามไฮไลต์ระดับคำยังถูกต้องเมื่อข้อความที่พูดไม่ใช่ข้อความทั้งหน้า (เช่น บริเวณที่ข้ามไป การอ่านตามหน่วย การแทนที่คำอ่าน) - ชนิด
TPdfSpokenTextและTPdfSpokenSpanถือสตริงที่พูดออกเสียงพร้อมช่วงหน้าต้นทางที่ใช้สร้างมัน; ออฟเซ็ตบนตัวคั่นที่แทรกไว้จะชี้ไปยังคำที่แมปถัดไป และออฟเซ็ตที่เลยช่วงที่แมปไว้จะรายงานว่าไม่พบคู่ตรง
Version 1.56.9
เพิ่มเติม
Demo\Delphi\PreflightReportเพิ่มตัวอย่าง Action Plan ที่ย่อมาตรฐานที่ไม่ผ่าน งานที่ต้องให้ความสำคัญ ขั้นตอนถัดไป รหัสปัญหา และข้อเสนอแนะให้เป็นรายการแก้ไขDemo\Delphi\PreflightReportCliยอมรับplan/actionplanเป็นรูปแบบเอาต์พุตสำหรับการรันแบบไฟล์เดี่ยวและแบบชุด โดยเขียนรายการแก้ไขเดียวกันลงในไฟล์ข้อความ
เปลี่ยนแปลง
- เดโม Delphi PreflightReport ทั้งสองตัวตอนนี้แสดงจำนวนสถานะ pass / action / review ควบคู่กับจำนวนมาตรฐานและ issue ทั้งหมด
Version 1.56.8
เปลี่ยนแปลง
ViewerInteractionLabตอนนี้มีปุ่มควบคุมการกระโดดหน้า ปุ่มซูมด้วยตัวเอง การบันทึกพิกัดแบบคลิกผ่านDeviceToPage/PageToDeviceและบันทึกปฏิสัมพันธ์ที่ชัดเจนขึ้นสำหรับการตรวจสอบการเลือก การค้นหา การหมุน และการนำทาง- หน้า readme ของ
ViewerInteractionLabตอนนี้อธิบายเวิร์กโฟลว์ปฏิสัมพันธ์ที่เพิ่มเข้ามาในชุด readme ของเดโมที่แปลแล้ว
Version 1.56.7
เพิ่มเติม
AccessibilityWorkbenchCliจับคู่ข้อค้นพบทุกข้อที่ถูกทริกเกอร์กับ WCAG 2.1 Success Criteria และพื้นที่ข้อกำหนดของ ISO 14289-1 (PDF/UA-1) และแสดงส่วนการครอบคลุมมาตรฐานในรายงานAccessibilityWorkbenchCliคำนวณคะแนนการเข้าถึงที่มีเอกสารอธิบายตั้งแต่ 0-100 พร้อมกฎหักคะแนนที่เผยแพร่แล้วและช่วง excellent / good / needs work / poor โดยแสดงผลแยกต่อไฟล์และเป็นค่าเฉลี่ยของแบตช์AccessibilityWorkbenchCliยอมรับfailscore=Nเพื่อให้การรันล้มเหลว (exit code 2) เมื่อมีไฟล์ใดคะแนนต่ำกว่า NAccessibilityWorkbenchCliเขียนบันทึก SARIF 2.1.0 เมื่อชื่อสรุปแบตช์ลงท้ายด้วย.sarifโดยมีหนึ่ง rule ต่อชนิดของข้อค้นพบและติดแท็ก WCAG 2.1 กับ PDF/UA ไว้เพื่อใช้กับ CI และ code-scanning ingestionAccessibilityWorkbenchCliเพิ่มคำสั่งversionที่พิมพ์เวอร์ชัน PDFiumPas ที่ลิงก์อยู่
Version 1.56.6
เพิ่มเติม
IntakeWorkbenchCliคำนวณ forensic hash แบบ SHA-256 ของแต่ละไฟล์นำเข้า (ลดระดับเป็นunavailableบนคอมไพเลอร์ที่ไม่มีSystem.Hash) และรายงานไว้ในทุกฟอร์แมตIntakeWorkbenchCliยอมรับpasswords=file.txtเพื่อทดลองปลดล็อกเอกสารที่ต้องใช้รหัสผ่านจากรายการตัวเลือก โดยบันทึกดัชนีของตัวเลือกที่ตรงกันโดยไม่เคยบันทึกข้อความรหัสผ่านIntakeWorkbenchCliยอมรับcopyto=dirเพื่อส่งไฟล์ที่ตรวจสอบแต่ละไฟล์ไปยังโฟลเดอร์ย่อยตามระดับความเสี่ยง ทำให้ตัวตรวจสอบกลายเป็นตัวคัดแยกงานนำเข้าIntakeWorkbenchCliเขียนบันทึก SARIF 2.1.0 เมื่อชื่อสรุปแบตช์ลงท้ายด้วย.sarifโดยมีหนึ่ง rule ต่อธงความเสี่ยงและหนึ่งผลลัพธ์ต่อไฟล์ที่ถูกตั้งธง เพื่อใช้กับ CI และ code-scanning ingestionIntakeWorkbenchCliเพิ่มคำสั่งversionที่พิมพ์เวอร์ชัน PDFiumPas ที่ลิงก์อยู่
Version 1.56.5
เพิ่มเติม
IntakeWorkbenchCliตอนนี้สรุปการกระทำหลังนำเข้าแบบแนะนำ เช่น accept, request-password, manual-review, quarantine และ deduplicate และแสดงจำนวนการกระทำในสรุปแบตช์AccessibilityWorkbenchCliตอนนี้สรุปการกระทำแก้ไขที่แนะนำ เช่น pass-through, remediate-tags, run-ocr, remediate-semantics และ manual-review พร้อมจำนวนการกระทำของแบตช์ที่ตรงกัน
เปลี่ยนแปลง
- เดโม CLI ระดับเครื่องมือทั้งสองตัวตอนนี้แสดงการกระทำที่แนะนำในเอาต์พุต console, text, HTML, JSON และ CSV เพื่อให้ผู้ปฏิบัติงานแบตช์สามารถจัดเส้นทางไฟล์ได้โดยไม่ต้อง post-process ฟิลด์ความเสี่ยงหรือสถานะ
Version 1.56.4
แก้ไข
- การอ่าน annotations, bookmarks หรือ link annotations วนลูปตอนนี้ไม่รั่วสตริงข้อความของรายการก่อนหน้าอีกต่อไป: เรคคอร์ดผลลัพธ์
TPdfAnnotation,TBookmarkและTLinkAnnotationถูกล้างด้วยการเริ่มต้นที่รับรู้ชนิด managed แทนการ zero หน่วยความจำดิบ ดังนั้นเอกสารที่มี annotations จำนวนมากซึ่งมีข้อความจึงไม่ทำให้หน่วยความจำของกระบวนการพองตลอดอายุการทำงานของแอป - เมื่อทำลาย
TPdfที่เคยลงทะเบียนตัวจัดการOnUnsupportedFeatureไว้ ตอนนี้จะถอดตัวจัดการออกจาก PDFium callback ระดับโปรเซส เพื่อให้การโหลดเอกสารถัดไปจากTPdfอีกตัวที่ไม่มีตัวจัดการของตัวเองไม่สามารถเรียกกลับเข้า component ที่ถูก free ไปแล้วได้อีก (use-after-free)
Version 1.56.3
แก้ไข
AccessibilityWorkbenchCliไม่นับหน้าว่างเป็นหน้าการอ่านตามลำดับแบบ heuristic อีกต่อไป ดังนั้นเอกสารที่มีหน้าคั่นว่างจะคงสถานะการเข้าถึงที่ถูกต้อง; หน้าที่ไม่มีเนื้อหาให้อ่านจะแสดงแยกต่างหากAccessibilityWorkbenchCliการตรวจจับ table header จะไม่ให้เครดิตตารางนอกสุดกับเซลล์THที่เป็นของตารางซ้อนอีกต่อไป และการจับคู่ชื่อฟอร์มฟิลด์กับชื่อฟอนต์จะทำแบบตรงตัวพิมพ์ เพื่อไม่ให้รวมฟิลด์ต่างกันเข้าด้วยกันIntakeWorkbenchCliรายการโฮสต์ของ URL ตอนนี้ตัดส่วน userinfo, query และ fragment ออก ดังนั้นลิงก์ที่สร้างขึ้นอย่างtrusted.example@evil.exampleจะถูกนับว่าเป็นโฮสต์จริง และเป้าหมายmailto:จะส่งโดเมนของตัวเองมาแทนที่จะหายไปIntakeWorkbenchCliรายงาน Markdown จะ escape backtick ใน path, host และชื่อไฟล์แนบที่ผู้โจมตีควบคุมได้ เพื่อให้รูปแบบรายงานไม่ถูกทำลายจากภายในเอกสาร
เปลี่ยนแปลง
AccessibilityWorkbenchCliตอนนี้รายงานความล้มเหลวของการสแกนฟอนต์และการสแกนฟอร์มฟิลด์เป็นตัวนับแยกกัน ทำเครื่องหมายฟอนต์ที่ไม่ได้ฝังแต่มี instance ที่ฝังอยู่ด้วย และตัดรายการฟอนต์ที่ยาวด้วยเครื่องหมายบอกการตัดทอนอย่างชัดเจนIntakeWorkbenchCliตอนนี้เพิ่มคอลัมน์จำนวน attachment-annotation ในสรุปแบตช์ และจำกัดการนับ annotations รายหน้าไว้ที่ 20000 รายการต่อหน้า โดยรายงานค่าจำกัดนี้ในทุกฟอร์แมต
Version 1.56.2
เพิ่มเติม
AccessibilityWorkbenchCliตอนนี้ตรวจสอบการฝังฟอนต์ ข้อความช่วยเหลือของฟอร์มฟิลด์ แหล่งที่มาของลำดับการอ่าน เค้าโครงเอกสาร โครงสร้างตารางและรายการ ข้อความทางเลือกที่น่าสงสัย และรายละเอียดการตรวจรายหน้าที่ละเอียดขึ้น เพื่อให้รายงานแบตช์ด้านการเข้าถึงระบุเป้าหมายสำหรับการแก้ไขได้มากขึ้นIntakeWorkbenchCliตอนนี้รายงานขีดจำกัดการสแกนหน้า การกระทำ launch และ remote-go-to รายการโฮสต์ของ URI จำนวน annotations ฟีเจอร์ PDFium ที่ไม่รองรับ ตัวระบุเอกสารที่ซ้ำกัน และธงความเสี่ยงที่ขยายเพิ่มขึ้นสำหรับการตรวจนำเข้าอัตโนมัติ
เปลี่ยนแปลง
IntakeWorkbenchCliรองรับmaxpages=Nในโหมดไฟล์เดี่ยวและโหมดแบตช์ เพื่อจำกัดการสแกนหน้าต่อเอกสาร ขณะเดียวกันก็ยังรายงาน metadata, attachment, script, XFA, signature และความเสี่ยงได้ครบถ้วน
Version 1.56.1
แก้ไข
- การโหลด
pdfium.dllเวอร์ชันเก่าที่ไม่มี export ใหม่กว่าจะล้มเหลวอย่างเรียบร้อย: เส้นทางความล้มเหลวจะรีเซ็ตจุดเข้า API ที่ผูกไว้ทุกตัว ดังนั้นการตรวจAssigned()(เช่นบนFPDF_GetLastErrorหรือFPDF_GetSecurityHandlerRevision) จะแจ้งว่าลibraries ยังไม่ถูกโหลด แทนที่จะเรียกเข้าโมดูลที่ unload ไปแล้วและแครชด้วย access violation UnloadLibraryตอนนี้ล้าง binding ของ PDFium API ทั้งหมดแทนที่จะล้างเฉพาะ helper ของ V8 ที่เป็นตัวเลือก เพื่อไม่ให้ function pointer เก่าเหลืออยู่หลังจาก DLL ถูกปล่อย
Version 1.56.0
เพิ่มเติม
- เคอร์เซอร์อ่านแบบคาราโอเกะระดับคำบน
TPdfView:TrackReadingWordAtแมปออฟเซ็ตอักขระคำปัจจุบันจากเอนจิน text-to-speech (เช่น SAPIStatus.InputWordPosition) ไปยัง word box ของหน้า ไฮไลต์คำที่มีออฟเซ็ตนั้นเป็นโอเวอร์เลย์แยกเหนือบล็อกการอ่าน เลื่อนคำนั้นเข้ามาในมุมมอง และคืนดัชนีคำ เพื่อให้คำที่พูดสว่างขึ้นตามเสียงที่ดำเนินไป SetReadingWordและClearReadingWordตั้งค่าหรือยกเลิกคำที่ถูกไฮไลต์จากTPdfWordBoxโดยตรง; การตั้งค่าคำเดิมซ้ำจะไม่ทำอะไร จึงไม่ทำให้การติดตามระดับคำกระพริบReadingWordColorและReadingWordFollowควบคุมสีเคอร์เซอร์คำและกำหนดว่ามุมมองจะเลื่อนคำที่ถูกพูดให้อยู่ในมุมมองโดยอัตโนมัติหรือไม่
Version 1.55.2
แก้ไข
- ตอนนี้ ViewerInteractionLab ให้แถวแถบเครื่องมือมีพื้นที่แนวตั้งมากขึ้น ทำให้ Open PDF, Create Sample, การนำทาง การค้นหา และการควบคุมการเลือกไม่ทับซ้อนกันเมื่อใช้ฟอนต์ที่ถูกปรับสเกล
Version 1.55.1
แก้ไข
- ตอนนี้ ViewerInteractionLab วาง Prev, Next และ Rotate ไว้บนแถวแถบเครื่องมือแถวที่สอง เพื่อหลีกเลี่ยงการทับซ้อนตอนเริ่มต้นกับ Open PDF และ Create Sample
Version 1.55.0
เพิ่มเติม
- บริดจ์จากคำไปยังการเลือกสำหรับการอ่านแบบ “read it, select it”:
TPdfView.SelectWordBoxและSelectWordSpanเลือก word box เดี่ยวหรือช่วง word box บนหน้าเดียวกันจากPageWordBoxesตามช่วงอักขระของมัน เพื่อให้คำหรือบรรทัดที่กำลังถูกอ่านสามารถถูกเลือกและคัดลอกได้ด้วย WordBoxIndexAtCharIndexแมปดัชนีอักขระย้อนกลับไปยัง word box ที่เก็บมันไว้ ขับเคลื่อนไฮไลต์แบบคำต่อคำเมื่อเคอร์เซอร์อ่านของ TTS เคลื่อนต่อไป
Version 1.54.0
เพิ่มเติม
- API สำหรับอ่านค่าฟอร์มฟิลด์ที่โฟกัสจาก logical cursor โดยตรง:
FocusedFormFieldValue,FocusedFormFieldNameและFocusedFormFieldDetailsบนTPdfและTPdfViewรายงานค่าของฟิลด์ปัจจุบัน ชื่อที่มนุษย์อ่านรู้เรื่องได้ (/TUtooltip และถ้าไม่มีจะ fallback ไป/T) และTPdfFormFieldInfoแบบครบถ้วน (type, flags, options) — ทุกอย่างที่ voice UI ต้องใช้เพื่อประกาศขณะไล่ไปตามฟอร์ม
แก้ไข
FocusedFormFieldValueอ่านฟิลด์ผ่านFocusedFormFieldIndexแทน pdfium interactive focus ดังนั้นตัวกรอกฟอร์มที่ขับด้วยเสียงจะได้ค่าที่ถูกต้องแม้ไม่มี caret บนหน้าจอ (ส่วนFocusedFormFieldTextที่มีอยู่เดิมยังสะท้อน pdfium focus ตามเดิมและไม่เปลี่ยนแปลง)
Version 1.53.0
เพิ่มเติม
- รองรับการไฮไลต์ระดับคำ:
TPdf.PageWordBoxesและTPdfView.PageWordBoxesแยกหน้าหนึ่งออกเป็นเรคคอร์ดTPdfWordBoxแต่ละตัวเก็บข้อความของคำ ช่วงอักขระ และกรอบล้อมในพิกัดของหน้า เพื่อให้ตัวอ่านเพื่อการเข้าถึงไฮไลต์คำที่พูดออกมาทีละคำได้ ("karaoke" reading) โดยส่งกรอบนั้นให้SetReadingHighlight BuildWordBoxesเปิดเผยขั้นตอน tokenizer แยกออกมาโดยลำพัง แปลงข้อความของหน้าเป็น word box พร้อมช่วงอักขระ
Version 1.52.0
เพิ่มเติม
- ตัวช่วยการเรนเดอร์สำหรับผู้ใช้สายตาเลือนราง
InvertPdfBitmap,GrayscalePdfBitmapและDuotonePdfBitmapใช้การแปลงสีแบบ in-place กับบิตแมป 32 บิตที่เรนเดอร์แล้ว เพื่อให้ตัวอ่านเพื่อการเข้าถึงแสดงหน้ากลับสี / โหมดมืด เป็นระดับสีเทา หรือเป็นโทนสองสีแบบกำหนดเองได้ (เช่นพื้นหลังเข้มกับข้อความสว่าง) สำหรับผู้ใช้สายตาเลือนราง - การแปลงทำงานทีละพิกเซลและให้ผลเหมือนกันบน VCL และ Lazarus/LCL โดยไม่เปลี่ยนขนาดของบิตแมป
Version 1.51.0
เพิ่มเติม
- หน่วยการอ่านระดับประโยคสำหรับการฟังอ่านเพื่อการเข้าถึง:
TPdf.ReadingUnits,TPdf.DocumentReadingUnitsและTPdfView.ReadingUnitsแปลงสตรีมเนื้อหาที่อ่านได้ให้เป็นเรคคอร์ดTPdfReadingUnitที่เรียงลำดับและมีขนาดระดับประโยค — แต่ละรายการถือข้อความที่จะพูดออกมา พร้อมชนิดเชิงความหมาย หน้า กรอบไฮไลต์ และแท็กภาษา เพื่อให้แอป screen reader ไล่ผ่านหน้าเดียวหรือทั้งเอกสารทีละหน่วยที่พูดออกมา - การนำทางเชิงความหมายด้วย
NextReadingUnitOfKindช่วยให้ voice UI กระโดดไปยังหัวข้อ รูปภาพ รายการ หรือเซลล์ตารางก่อนหน้าหรือถัดไปได้โดยไม่ต้องไล่สตรีมด้วยมือ BuildReadingUnitsแปลงTPdfContentFragmentsใด ๆ ให้เป็น reading unit ได้โดยตรง: หัวข้อและคำอธิบายรูปภาพ/Alt จะคงเป็นก้อนเดียว ส่วนย่อหน้าจะแตกตามขอบเขตประโยค จุดทศนิยมจะถูกเก็บไว้ และเคอร์เซอร์การอ่านเป็นดัชนีที่ผู้เรียกเป็นเจ้าของธรรมดา
Version 1.50.0
เพิ่มเติม
ValidatePdfAตอนนี้ตรวจเอกสาร PDF 1.5+ ที่เก็บ catalog, OutputIntent หรือ dictionary อื่นไว้ภายใน compressed object stream ได้ (/Type /ObjStm) object stream จะถูก inflate และ object ที่บรรจุอยู่จะถูก resolve ดังนั้นเอกสารเหล่านี้จะถูกตรวจตามความถูกต้องของตัวเองแทนที่จะถูกแจ้งว่าขาด marker PDF/A
Version 1.49.5
แก้ไข
ValidatePdfAไม่รายงานคำอธิบายpdfaExtension:schemasที่หายไปว่าเป็นปัญหาอีกต่อไป เพราะ schema ตัวระบุ PDF/A (pdfaid) เป็นที่รู้จักดีอยู่แล้ว จึงไม่ใช่ทั้ง veraPDF และ PDF/A-2/-3 ที่ต้องการคำอธิบาย extension schema สำหรับมัน และการตั้งธงว่าขาดมันทำให้ PDF/A ของบุคคลที่สามที่สอดคล้องถูกมองว่าผิดไปทั้งหมด เอกสารที่ไลบรารีสร้างเองยังคงมีคำอธิบายนี้อยู่
Version 1.49.4
แก้ไข
ValidatePdfAตอนนี้ตรวจจับระดับ conformance ได้เมื่อ identifier ของ PDF/A ถูกเขียนเป็น XML attributes (pdfaid:part="2") แทน child elements ทำให้เอกสารแบบ attribute-form ไม่ถูกมองว่าเป็นระดับที่ไม่รู้จักอีกต่อไป นอกจากนี้ยังแก้ปัญหาลูกโซ่ที่ระดับซึ่งตรวจไม่พบทำให้การตรวจเฉพาะ part ย้อนกลับไปใช้กฎ PDF/A-1 ที่เข้มเกินไป และไปตั้งธง embedded files กับ transparency ที่ PDF/A-2 และ PDF/A-3 อนุญาต
Version 1.49.3
แก้ไข
ValidatePdfAตอนนี้ตรวจเอกสาร PDF 1.5+ ที่ข้อมูล cross-reference เป็น cross-reference stream ได้แล้ว (ไฟล์ที่ไม่มีคำหลักtrailer) ระดับ conformance, trailer/IDและ marker อื่น ๆ จะถูกอ่านจาก dictionary ของ cross-reference stream ดังนั้นเอกสารเหล่านี้จะถูกตรวจตามความถูกต้องของตัวเองแทนที่จะถูกแจ้งว่าไม่สอดคล้องทั้งหมด
Version 1.49.2
แก้ไข
ValidatePdfAไม่รายงานปัญหา non-embedded-font ที่ผิดพลาดบนเอกสารที่ฝังฟอนต์ทุกตัวของมันอีกต่อไป heuristic เดิมเปรียบเทียบจำนวนโทเคน/FontDescriptorกับโปรแกรมฟอนต์ที่ฝังไว้ แต่ฟอนต์ที่ฝังแต่ละตัวมีโทเคน/FontDescriptorสองตัว (reference ของ font dictionary บวก object ของ descriptor) จึงทำให้ไฟล์ที่ฝังฟอนต์ทุกไฟล์ถูกตั้งธงผิด ตอนนี้การตรวจจะรายงานเฉพาะเอกสารที่อ้างถึงฟอนต์แต่ไม่ฝัง font program เลย ซึ่งตรงกับการแก้ไขValidatePdfUaที่เกี่ยวข้อง
Version 1.49.1
แก้ไข
- เอาต์พุต PDF/A ตอนนี้ตรวจผ่านเป็น PDF/A-1b และ PDF/A-1a ที่สอดคล้องกับ veraPDF: สตรีม sRGB OutputIntent ICC profile ที่ฝังไว้ (อ้างอิงโดย
/DestOutputProfile) ตอนนี้ประกาศจำนวน component/Nที่จำเป็น (3 สำหรับโปรไฟล์ RGB ในตัว) ตามที่ ISO 19005-1 6.2.3.2 กำหนด เอกสารที่สร้างโดยSaveAsPdfAก่อนหน้านี้ไม่ผ่านการตรวจ PDF/A-1 อย่างเข้มงวดเพราะสตรีม profile ปลายทางไม่ได้ระบุ/N; ค่านี้ได้มาจาก header ของ ICC profile ดังนั้นโปรไฟล์ CMYK หรือ Gray ที่ผู้เรียกส่งมาเองก็จะได้จำนวนที่ถูกต้องเช่นกัน
Version 1.49.0
แก้ไข
ValidatePdfUaไม่รายงานการระบุ XMP ที่หายไปแบบผิดพลาดบน PDF ที่มีแท็กและเป็นไปตามข้อกำหนดอีกต่อไป — ตัวระบุ PDF/UA (pdfuaid:part)dc:titleวันที่ XMP และ/IDของ trailer ตอนนี้ถูกอ่านจากไบต์ต้นฉบับของเอกสารแทนสำเนาที่บันทึกใหม่ ซึ่งละเว้นสตรีม XMP/Metadataและสำหรับไฟล์ cross-reference-stream ก็ละเว้น/IDของ trailer ด้วยValidatePdfUaแก้การตรวจ font-embedding แล้ว ทำให้เอกสารที่ฝังฟอนต์ทั้งหมดของตัวเองไม่ถูกแจ้งว่ามีฟอนต์ที่ไม่ได้ฝังอีกต่อไป; ตอนนี้จะตั้งธงเฉพาะเอกสารที่อ้างถึงฟอนต์แต่ไม่ฝัง font program ใดเลยValidatePdfUaตอนนี้ยอมรับ structure element ชนิดFormulaที่ระบุข้อความทางเลือกผ่านActualTextแทนรายการAlt(ISO 14289-1 §7.7) ให้สอดคล้องกับกฎของFigureที่มีอยู่
Version 1.48.0
เพิ่มเติม
- การเลือกข้อความแบบโปรแกรมบน
TPdfView:SelectTextRange(ตามหน้าและช่วงอักขระ) และSetSelection(ตามช่วงต่อหน้าแบบระบุชัดเจน) เลือกข้อความจากโค้ดได้ — เช่นเพื่ออ่านและไฮไลต์ย่อหน้าหนึ่ง; ทั้งสองแบบจะรีเพนต์และเรียกOnSelectionChangeเมื่อการเลือกเปลี่ยนไปSelectionRangesอ่านการเลือกปัจจุบันเป็นช่วงอักขระต่อหน้า และSelectionRectanglesคืนกรอบของมันในพิกัดหน้าเพื่อใช้ไฮไลต์แบบกำหนดเองหรือสั่งเลื่อนให้เห็น
Version 1.47.0
เพิ่มเติม
- การนำทางฟอร์มฟิลด์สำหรับการกรอกฟอร์มด้วยเสียง ทั้งบน
TPdfและTPdfView:FormFieldTabOrder,FocusedFormFieldIndex,FocusFormField,FocusNextFormField,FocusPreviousFormField,ClearFormFieldFocusและFocusedFormFieldTextตัวเหล่านี้ย้าย logical field cursor ไปตามฟิลด์ widget ของหน้าในลำดับแท็บ (วนกลับเมื่อสุดทาง) เพื่อให้ตัวอ่านเพื่อการเข้าถึงไล่ไปตามฟอร์ม ประกาศแต่ละฟิลด์ผ่านFormFieldInfo[Index].AlternateName(tooltip ของ /TU) และกรอกค่าผ่านFormField[Index] - อีเวนต์
TPdfView.OnFormFieldFocusChangeที่ถูกเรียกเมื่อ field cursor เคลื่อนที่ (ส่งดัชนีฟิลด์ใหม่ หรือ -1 เมื่อถูกล้าง)
Version 1.46.0
เพิ่มเติม
- สตรีมเนื้อหาสำหรับการฟังอ่านเพื่อการเข้าถึง:
TPdf.ReadableContent,TPdf.ReadablePageContent,TPdf.DocumentReadableContentและTPdfView.ReadableContentคืนรายการTPdfContentFragmentเชิงความหมายที่เรียงลำดับแล้ว แต่ละรายการถือข้อความที่จะพูด (glyph จริง หรือActualText/Alt สำหรับรูปภาพ) ชนิดของ fragment (หัวข้อพร้อมระดับ, ย่อหน้า, รูปภาพ, รายการ, เซลล์ตาราง, ลิงก์, ธรรมดา) ภาษา หน้าแบบเริ่มที่ 1 และกรอบไฮไลต์ทั้งระดับบล็อกและรายบรรทัด Tagged PDF จะถูกจัดลำดับเป็นเส้นตรงตาม logical reading order จาก structure tree; หน้า untagged จะ fallback ไปตามลำดับการเรนเดอร์เพื่อให้เอกสารใด ๆ ก็อ่านออกเสียงได้ - การไฮไลต์การอ่านแบบซิงก์บน
TPdfView:SetReadingHighlight,ClearReadingHighlightและReadingHighlightColorที่เผยแพร่ไว้ จะไฮไลต์บล็อกที่กำลังอ่านอยู่ซ้อนอยู่เหนือโอเวอร์เลย์ของการค้นหาและการเลือก - ชนิดสาธารณะใหม่
TPdfContentFragment,TPdfContentFragments,TPdfReadableContent,TPdfContentFragmentKindและTPdfReadingOrderSourceพร้อม helper ใหม่ClassifyStructType
Version 1.45.0
เพิ่มเติม
ValidatePdfUaตอนนี้เดินผ่าน live tagged structure tree ด้วย และรายงานการละเมิดเนื้อหา 3 กรณีที่มีความเชื่อมั่นสูงซึ่งการสแกนระดับไบต์ตรวจไม่พบ: elementFigureที่ไม่มีทั้ง Alt entry และ ActualText (ISO 14289-1, 7.3), elementFormulaที่ไม่มี Alt attribute (7.7) และ elementNoteที่ไม่มี unique ID (7.9) ค่าTPdfUaValidationIssueใหม่ 3 ค่าแสดงกรณีเหล่านี้คือpvuaiFigureMissingAlt,pvuaiFormulaMissingAltและpvuaiNoteMissingIdการเดิน tree จะถูกข้ามสำหรับเอกสาร untagged- helper สาธารณะใหม่
ValidatePdfUaStructureElementsนำกฎของ structure tree เหล่านั้นไปใช้กับรายการ element แบบแบน ๆ (ตามที่TPdf.StructureElementsคืนมา) เพื่อให้สามารถเรียกตรวจหรือทดสอบแบบ unit-test ได้โดยไม่ต้องโหลดเอกสารทั้งฉบับ
Version 1.44.5
แก้ไข
- การตรวจ font-embedding ของ
ValidatePdfA(pvaiFontNotEmbedded, ISO 19005-1, 6.3.4) ตอนนี้ยังตรวจพบ simple font ที่ไม่ได้ฝังและไม่มี/FontDescriptorด้วย โดยเฉพาะฟอนต์ Type 1 มาตรฐานทั้ง 14 ตัว (Helvetica, Times, Courier และอื่น ๆ) ซึ่ง PDF/A กำหนดให้ต้องฝังโดยไม่มีข้อยกเว้น ก่อนหน้านี้ฟอนต์แบบนี้ไม่ถูกสังเกตเห็น; ตอนนี้การตรวจจะนับ dictionary ของ simple font (/Type1,/TrueType,/MMType1) เทียบกับโปรแกรมฟอนต์ที่ฝังไว้ด้วย ซึ่งสะท้อนการแก้ PDF/UA ใน 1.44.3
Version 1.44.4
แก้ไข
ValidatePdfVTตอนนี้ปฏิเสธ DPart tree ที่ผิดรูปแบบตาม ISO 16612-2 §6.5 แล้ว กรณีที่/DPartsเป็นอาเรย์อ้างอิงแบบแบนแทนที่จะเป็นอาเรย์ของอาเรย์ตามที่ต้องการ หรือกรณีที่ leaf DPart ทำซ้ำหน้า/Startเป็น/Endทั้งที่ช่วงนั้นมีเพียงหนึ่งหน้าValidatePdfVTตอนนี้ตรวจชื่อ/NodeNameListเป็นค่า XML NMTOKEN หลังขยาย escape ของ PDF name#xxแล้ว ดังนั้นชื่อระดับลำดับชั้นที่ไม่ถูกต้องจะแจ้งผ่านpvviMissingDPartRootแทนที่จะถูกยอมรับว่าเป็น DPart structure ที่ใช้ได้
Version 1.44.3
แก้ไข
- การตรวจ font-embedding ของ
ValidatePdfUa(pvuaiFontNotEmbedded, ISO 14289-1, 7.21.4) ตอนนี้ยังตรวจพบ simple font ที่ไม่ได้ฝังและไม่มี/FontDescriptorด้วย โดยเฉพาะฟอนต์ Type 1 มาตรฐานทั้ง 14 ตัว (Helvetica, Times, Courier และอื่น ๆ) ซึ่ง PDF/UA ไม่ให้ข้อยกเว้นเรื่องการฝัง ก่อนหน้านี้ฟอนต์แบบนี้ไม่ถูกสังเกตเห็น และเอกสารที่ใช้มันอาจถูกรายงานว่าผ่านมาตรฐานได้; ตอนนี้การตรวจจะนับ dictionary ของ simple font (/Type1,/TrueType,/MMType1) เทียบกับโปรแกรมฟอนต์ที่ฝังไว้ด้วย
Version 1.44.2
แก้ไข
ValidatePdfVTตอนนี้ปล่อย markerpdfvtid:GTS_PDFVTVersionที่มีอยู่แต่ไม่รู้จักให้เป็นpvcUnknownแทนที่จะลดระดับเป็นpvcNoneวิธีนี้ทำให้สตริงระดับไฟล์ที่ไม่ถูกต้อง เช่นPDF/VT-2sแยกออกจากเอกสารที่ไม่มี marker PDF/VT ได้; PDF/VT-2s ถูกระบุโดยส่วนหัว MIME stream ใน ISO 16612-2 Annex A ไม่ใช่โดย XMP marker ของไฟล์ PDF- การตรวจ
/DPartRootตอนนี้ตรวจ semantics ของ tree ตาม ISO 16612-2 §6.5 อย่างเข้มงวดขึ้น:/DPartRootNodeและ/NodeNameListต้องอธิบายความลึก DPart จริง ลิงก์ parent ของ DPart ต้องสร้าง tree ขึ้นมาได้/Startและ/DPartsใช้ร่วมกันไม่ได้ และแต่ละหน้า/DPartต้องชี้ไปยัง leaf DPart ที่ครอบคลุมหน้าในลำดับ depth-first เดียวกับ page tree
Version 1.44.1
แก้ไข
SaveAsPdfVTตอนนี้เขียน Document Part Hierarchy ขั้นต่ำตาม ISO 16612-2 §6.5 เมื่อ PDF ต้นทางไม่มี/DPartRootที่ใช้งานได้ tree ที่สร้างขึ้นจะเชื่อมทุกหน้าผ่าน/DPartรักษา hierarchy ที่ถูกต้องที่มีอยู่เดิม และปล่อย metadata ของ recipient/DPM ที่ละเอียดยิ่งกว่าให้เวิร์กโฟลว์ที่เรียกใช้จัดการValidatePdfVTตอนนี้ตรวจสอบ DPart structure ที่ใช้ได้ อ่านค่า PDF/VT XMP จากทั้ง RDF attributes และ element text และบังคับการจับคู่ฐาน PDF/VT กับ PDF/X แบบตรงตัว: PDF/VT-1 ต้องใช้ PDF/X-4 ส่วน PDF/VT-2 ต้องใช้ PDF/X-4p, PDF/X-5g หรือ PDF/X-5pgTPdfVTSaveOptions.Conformance = pvc2ไม่เขียน marker PDF/VT-2 แบบไฟล์เดี่ยวที่ไม่ถูกต้องอีกต่อไป ตัวเขียนไฟล์เดี่ยวจะ normalize ผลลัพธ์เป็น PDF/VT-1 เพราะ PDF/VT-2 ต้องใช้ semantics แบบ file-set
Version 1.44.0
เพิ่มเติม
ValidatePdfUaตอนนี้รายงานการละเมิด PDF/UA ระดับเนื้อหาที่ตรวจด้วยไบต์ได้เพิ่มเติมจาก marker ระดับฟอร์แมตไฟล์ด้วย: โปรแกรมฟอนต์ที่ไม่ได้ฝัง (ISO 14289-1, 7.21.4), ฟอนต์ที่ไม่มี/ToUnicodeCMap เมื่อไม่มี simple-font encoding ที่ได้รับข้อยกเว้น (7.21.7) และเอกสารที่มี annotations แต่ไม่ได้ประกาศ tab order ของหน้าเป็น/Tabs /S(7.18.3)- ค่า
TPdfUaValidationIssueใหม่ 3 ค่า —pvuaiFontNotEmbedded,pvuaiFontMissingToUnicodeและpvuaiMissingTabsOrder— ถูกแสดงโดยValidatePdfUaและในรายงาน preflight ค่าพวกนี้เป็น heuristic แบบหยาบที่ตั้งใจให้เป็นคำใบ้สำหรับ preflight มากกว่าจะเป็นการยืนยัน ISO 14289-1 แบบเต็ม
Version 1.43.1
แก้ไข
SaveAsPdfUaตอนนี้บังคับให้มีรายการ catalog ตามข้อกำหนด ISO 14289-1, 7.1 คือ/ViewerPreferences/DisplayDocTitle trueและ/MarkInfo/Marked true/Suspects falseแม้ว่าเอกสารต้นทางจะมี dictionary เหล่านั้นอยู่แล้วแต่มีค่าขาดหายหรือขัดแย้งก็ตาม ก่อนหน้านี้ marker จะถูก inject ก็ต่อเมื่อ dictionary หายไปทั้งหมดเท่านั้น ดังนั้นต้นทางที่มี/ViewerPreferencesแต่ไม่มีDisplayDocTitleหรือมี/MarkInfoที่ตั้ง/Marked falseจะ round-trip ออกมาเป็นไฟล์ที่ไม่สอดคล้อง- คีย์ที่มีอยู่เดิมใน dictionary
/ViewerPreferencesหรือ/MarkInfoจะถูกเก็บไว้ และ dictionary ที่ส่งมาเป็น indirect reference จะถูก resolve ก่อนนำคีย์บังคับมาใช้
Version 1.43.0
เพิ่มเติม
ValidatePdfAตอนนี้ใช้กฎ PDF/A-2 / PDF/A-3 สำหรับ embedded files, associated files และข้อความระดับ U แล้ว Embedded files ยังถูกปฏิเสธใน PDF/A-1; สำหรับ PDF/A-3 หาก embedded file ไม่มีคีย์/AFRelationshipที่ต้องมี (ISO 19005-3 Annex E) จะถูกตั้งธง ส่วน attachments ของ PDF/A-2 อนุญาตได้ (การสอดคล้องของไฟล์เหล่านั้นเองจะไม่ถูกตรวจแบบ recursive) issue ใหม่pvaiUnicodeMappingMissingรายงานเอกสาร PDF/A-2u หรือ PDF/A-3u ที่ฟอนต์ไม่มี mapping/ToUnicode(ISO 19005-2 6.2.11.7) ส่วน transparency และ optional content ยังถูกตั้งธงเฉพาะ PDF/A-1
Version 1.42.0
เพิ่มเติม
- PDF/A-2 (ISO 19005-2) และ PDF/A-3 (ISO 19005-3) ตอนนี้รองรับครบทั้งสามระดับ conformance — a, b และ u — ผ่าน
SaveAsPdfA,ValidatePdfAและ propertyPdfAConformanceแล้ว enumerationTPdfAConformanceได้รับpac2a,pac2u,pac3aและpac3uเพิ่มมา (PDF/A-1 ไม่มี Level u) การบันทึกจะเขียนpdfaid:partที่ตรงกัน (2 หรือ 3) และpdfaid:conformance(A, B หรือ U) พร้อมคง subtype ของ OutputIntentGTS_PDFA1ที่ ISO 19005-2 เก็บไว้เพื่อความเข้ากันได้ คำขอ Level A ยังจะ downgrade ไปเป็น Level B ที่ตรงกัน (สำหรับ part ใดก็ได้) เมื่อเอกสารไม่มี tagged structure ที่ระดับนั้นต้องใช้
Version 1.41.0
เพิ่มเติม
ValidatePdfAตอนนี้ตรวจพบการละเมิด PDF/A ระดับเนื้อหาที่การ inject marker แก้ไม่ได้ นอกเหนือจาก marker เชิงโครงสร้างที่รายงานไว้ก่อนแล้ว: JavaScript และ action อื่นที่ห้ามใช้ additional-actions (/AA) embedded filesLZWDecodetransparency (soft masks และ transparency groups) optional content (/OCProperties) annotation subtypes ที่ห้ามใช้ (FileAttachment, Sound, Movie, 3D, Screen) AcroForm/NeedAppearances trueและ/XFAฟอนต์ที่ descriptor ไม่มี embedded font program และการอ้าง Level A โดยไม่มี tagged structure ที่ ISO 19005-1 6.8 กำหนด; การตรวจ transparency, optional-content และ embedded-file ใช้กับ PDF/A-1 เท่านั้น (ฟีเจอร์เหล่านี้อนุญาตใน PDF/A-2 และ PDF/A-3) ค่าTPdfAValidationIssueใหม่จะแสดงแต่ละกรณี ส่วนค่าที่มีอยู่เดิมไม่เปลี่ยน
Version 1.40.3
แก้ไข
SaveAsPdfAตอนนี้ลบการเข้ารหัสของเอกสารต้นทางก่อนสร้าง PDF/A output แล้ว ISO 19005-1 6.1.3 ห้ามคีย์ trailer/Encryptแต่เส้นทางบันทึกก่อนหน้านี้เก็บ security handler ของต้นทางไว้ จึงทำให้การบันทึกเอกสารเข้ารหัสเป็น PDF/A ได้ไฟล์ที่ยังเข้ารหัสและไม่สอดคล้อง ตอนนี้การบันทึก PDF/A จะถอดรหัสเอกสารก่อน เอกสารที่ไม่เข้ารหัสไม่ได้รับผลกระทบ
Version 1.40.2
แก้ไข
- หยุดไม่ให้
SaveAsPdfAออกคำอ้าง conformance ระดับ A ของ PDF/A แบบผิดพลาด เมื่อขอ Level A (pac1a) แต่เอกสารต้นทางไม่มี marker ของ tagged-structure ตามที่ ISO 19005-1 6.8 ต้องการ — คือ/StructTreeRootใน catalog และ dictionary/MarkInfoที่มี/Marked true— ตอนนี้ไฟล์ที่บันทึกจะถูกระบุเป็น Level B (pdfaid:conformance=B) ที่ตรงกันแทนที่จะอ้าง Level A การส่งออก PDF/A-1b ที่เป็นภาพล้วนไม่ได้รับผลกระทบ
Version 1.40.1
แก้ไข
- ปรับการตรวจความสอดคล้องของเวอร์ชัน PDF ให้เข้มขึ้น เพื่อให้ action
SetOCGState(set-optional-content-group-state) ถูกนับเป็นฟีเจอร์ของ PDF 1.5 การบันทึกไปยังเป้าหมาย PDF 1.2, 1.3 หรือ 1.4 ที่มี actionSetOCGStateอยู่ตอนนี้จะถูกปฏิเสธให้ตรงกับ ISO 32000-1 (Table 198) ก่อนหน้านี้ action แบบนี้อาจลอดไปอยู่ใน output เวอร์ชันต่ำกว่าได้ ส่วน actionSetStateของ PDF 1.2 ที่แยกต่างหากและล้าสมัยยังคงยอมรับได้ตั้งแต่ PDF 1.2 เป็นต้นไป
Version 1.40.0
เพิ่มเติม
- ผูก API ต้นน้ำ
FPDFPageObj_AddExistingMark()ซึ่งใช้แนบ content mark ที่มีอยู่กับ page object เมื่อ page object ที่ติดกันใช้ mark เดียวกัน PDF ที่บันทึกจะยุบมันเป็น mark เดียวที่ครอบคลุมทั้งหมด; object ที่ไม่ติดกันจะได้สำเนาแยกกัน - ผูก API ต้นน้ำ
FPDFTextObj_SetFontSize()สำหรับเปลี่ยนขนาดจุดของ text object ที่มีอยู่ เพื่อเติมเต็ม bindingFPDFTextObj_GetFontSize()ที่มีอยู่แล้ว
เปลี่ยนแปลง
- รีเฟรช PDFium runtime DLLs ที่บันเดิลมา (Win32 และ Win64 ทั้งบิลด์มาตรฐานและ V8) ไปเป็น upstream snapshot วันที่ 2026-06-02
Version 1.39.53
เปลี่ยนแปลง
- เปลี่ยนเดโม Delphi
PDFViewer,SplitViewและMultiPageViewerให้เปิดเอกสารในโหมดZoom to Pageเป็นค่าเริ่มต้น - การเรนเดอร์เริ่มต้นตอนนี้ปรับให้ทั้งหน้าพอดีกับพื้นผิวตัวแสดงก่อนที่ผู้ใช้จะเลือกระดับซูมเอง
- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.53
Version 1.39.52
เปลี่ยนแปลง
- ปรับปรุง
Demo\Lazarus\CreatePDFให้ตัวอย่างเริ่มต้นสร้าง PDF สองหน้าที่มี vector paths, เนื้อหาตาราง, รูปภาพฝัง, text annotation, ข้อความหมุน และคำอธิบายการสร้างเอกสารที่ชัดเจนขึ้น - เพิ่มหน้า
README.htmlที่ขัดเกลาสำหรับโฟลเดอร์เดโมทุกชุดของ Delphi, C++Builder และ Lazarus แทนที่ README แบบข้อความล้วนที่เหลืออยู่ด้วยคู่มือที่อ่านได้ในเบราว์เซอร์ - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.52
Version 1.39.51
- ปรับปรุงสรุปแบตช์ของ
Demo\Delphi\PreflightReportCliด้วยยอดรวมสถานะมาตรฐานสำหรับผล Pass, Action required และ Review ครอบคลุมมาตรฐานที่เลือก - แถวต่อไฟล์ตอนนี้มีจำนวน action-required และ review อยู่ในสรุป TXT / HTML / JSON / CSV ทำให้ตรวจ artifact ของ CI ได้ง่ายขึ้นโดยไม่ต้องเปิดรายงานที่สร้างขึ้นทีละไฟล์
- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.51
Version 1.39.50
- ปรับปรุงโหมดแบตช์แบบไดเรกทอรีของ
Demo\Delphi\PreflightReportCliให้batchdir=folderรวบรวมพาธ PDF ที่ค้นพบ จัดเรียง แล้วสร้างรายงานตามลำดับที่คงที่ - การสแกนไดเรกทอรีแบบ recursive ตอนนี้ให้ลำดับรายงานและแถวสรุปที่ทำซ้ำได้ ส่วนการประมวลผล
batch=list.txtแบบระบุตรง ๆ ยังคงรักษาลำดับของไฟล์รายการไว้ - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.50
Version 1.39.49
- ปรับปรุงสรุปแบตช์ของ
Demo\Delphi\PreflightReportCliให้บันทึกค่ารัน: ชนิดต้นทาง, พาธต้นทาง, สถานะ recursive, ไดเรกทอรีเอาต์พุต, รูปแบบรายงาน, มาตรฐานที่เลือก และโหมดfailon= - สรุป JSON ตอนนี้มี object
run, สรุป TXT และ HTML แสดงส่วนการตั้งค่าการรัน และแถว CSV ทำซ้ำคอลัมน์ตรวจสอบชุดเดียวกันสำหรับสเปรดชีตและ pipeline ของ CI - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.49
Version 1.39.48
- ปรับปรุงการตั้งชื่อเอาต์พุตแบตช์ของ
Demo\Delphi\PreflightReportCliเพื่อให้ชื่อไฟล์นำเข้าที่ซ้ำกันซึ่งใช้outdir=เดียวกันไม่เขียนทับรายงานที่สร้างให้กันและกันอีกต่อไป - การรันแบบแบตช์ตอนนี้จะต่อท้าย
-2,-3และ suffix ถัด ๆ ไปเมื่อพาธรายงานที่สร้างขึ้นถูกกำหนดไว้แล้วในการรันเดียวกัน และสรุปจะบันทึกพาธรายงานสุดท้ายที่ปลอดการชนกัน - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.48
Version 1.39.47
- ปรับปรุงสรุปแบตช์ของ
Demo\Delphi\PreflightReportCliให้เอาต์พุต TXT และ JSON มีผลรวมรวมของจำนวนไฟล์ทั้งหมด, ไฟล์ที่ประมวลผลแล้ว, ไฟล์ที่ล้มเหลว, issue และการจับคู่failon= - สรุป CSV ยังคงเป็นตารางแถวล้วนสำหรับผู้ใช้เดิม ส่วนสรุป HTML ยังคงแสดง metrics รวมชุดเดียวกันในส่วนหัวของแดชบอร์ด
- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.47
Version 1.39.46
- ปรับปรุง
Demo\Delphi\PreflightReportCliด้วยsummary=batch.html/.htmเพื่อให้การรันแบบแบตช์สามารถปล่อยแดชบอร์ดที่อ่านในเบราว์เซอร์ได้ควบคู่กับ manifest แบบ TXT / CSV / JSON - สรุป HTML แสดง metrics ของ total, processed, failed, issue และการจับคู่
failon=แล้วจึงแสดงแต่ละอินพุตพร้อมลิงก์รายงาน, สถานะ, จำนวน และข้อความข้อผิดพลาด - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.46
Version 1.39.45
- ปรับปรุง
Demo\Delphi\PreflightReportCliด้วยbatchdir=folderและrecursiveเพื่อให้สคริปต์สามารถสแกนโฟลเดอร์ PDF ได้โดยตรงโดยไม่ต้องเขียนไฟล์รายการก่อน - โหมดแบตช์แบบไดเรกทอรีนำพฤติกรรม
outdir=,summary=,standards=และfailon=จากโหมดแบตช์แบบใช้รายการกลับมาใช้ใหม่ ส่วนการสแกนแบบไม่recursiveจะดูเฉพาะโฟลเดอร์ที่เลือก และ recursive จะรวมโฟลเดอร์ย่อยด้วย - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.45
Version 1.39.44
- ปรับปรุง
Demo\Delphi\PreflightReportCliด้วยsummary=batch.csv|json|txtเพื่อให้การรันแบบแบตช์สามารถปล่อย manifest ที่เครื่องอ่านได้ไว้ข้างรายงานรายไฟล์ - สรุปแบตช์จะมีพาธอินพุตแต่ละรายการ, พาธรายงาน, สถานะ, จำนวนมาตรฐาน, จำนวนที่ผ่าน, จำนวน issue, สถานะการจับคู่
failon=และข้อความข้อผิดพลาดสำหรับงาน CI และสคริปต์ภายนอก - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.44
Version 1.39.43
- ปรับปรุง
Demo\Delphi\PreflightReportCliด้วยbatch=list.txtและoutdir=reportsเพื่อให้สคริปต์สร้างรายงาน preflight สำหรับรายการไฟล์ PDF ได้ในการรันครั้งเดียว - โหมดแบตช์ข้ามบรรทัดว่างและบรรทัดคอมเมนต์
#สร้างชื่อรายงาน.preflight.<ext>แต่ละรายการจาก PDF อินพุต ดำเนินต่อหลังข้อผิดพลาดรายไฟล์ และสรุปจำนวนไฟล์ที่ประมวลผลและล้มเหลวก่อนจะคืนค่า - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.43
Version 1.39.42
- ปรับปรุง
Demo\Delphi\PreflightReportCliด้วยfailon=none|issues|action|reviewเพื่อให้งาน CI แปลงผล preflight ที่สร้างขึ้นเป็น exit code แบบกำหนดได้ - CLI ตอนนี้คืนค่า exit code 2 เมื่อกฎ
failon=ที่เลือกตรงกันหลังจากสร้างไฟล์รายงานและ PDF รายงานที่แนบไว้แล้ว ส่วนข้อผิดพลาดระหว่างรันยังคงคืนค่า exit code 1 - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.42
Version 1.39.41
- ปรับปรุง
Demo\Delphi\PreflightReportCliด้วยattach=output.pdfเพื่อให้รายงาน preflight ที่สร้างขึ้นสามารถฝังเป็นไฟล์แนบระดับเอกสารในสำเนา PDF ใหม่ได้ - CLI จะเก็บไฟล์รายงาน TXT / HTML / Markdown / JSON / CSV ที่สร้างขึ้นไว้บนดิสก์และปฏิเสธการแนบกลับไปยังพาธ PDF อินพุตเดิม ช่วยลดความเสี่ยงจากการเขียนทับโดยไม่ตั้งใจ
- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.41
Version 1.39.40
- เพิ่ม
Demo\Delphi\PreflightReportCliซึ่งเป็นคอนโซลคู่หูของ Delphi สำหรับสร้างFPdfPreflightReportแบบสคริปต์ได้โดยไม่ต้องเปิดตัวแสดง - CLI รองรับการสร้างตัวอย่างแบบไม่มีอาร์กิวเมนต์ พร้อมอาร์กิวเมนต์อินพุต / เอาต์พุต, รหัสผ่านแบบเลือกได้, รูปแบบเอาต์พุต
text/html/md/json/csvและการกรองstandards=สำหรับ PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R และ PDF/VT - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.40
Version 1.39.39
- ขยาย
FPdfPreflightReportด้วยTPdfPreflightReport.ToMarkdownและSaveMarkdownToFileเพื่อให้ส่งออกรายงาน preflight เป็น Markdown ที่เหมาะกับ issue tracker ได้ - อัปเดตตัวอย่าง
PreflightReportของ Delphi, C++Builder และ Lazarus ให้สลับพรีวิว Markdown และมีคำสั่ง Save MD ควบคู่กับ workflow เดิมของ TXT / HTML / JSON / CSV - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.39
Version 1.39.38
- ขยายตัวอย่าง
SecurityAuditของ Delphi, C++Builder และ Lazarus ให้ส่งออกรายงาน audit แบบ JSON ได้ควบคู่กับ workflow การบันทึก / คัดลอก TXT เดิม - รายงาน JSON มี
format,generatedAt,summary,findingCountและแถวfindingsแบบมีโครงสร้างที่มีฟิลด์ severity, area และ detail - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.38
Version 1.39.37
- ขยาย
FPdfPreflightReportด้วยTPdfPreflightReport.ToCsvและSaveCsvToFileเพื่อให้ส่งออกรายงาน preflight เป็น CSV ที่เหมาะกับงานสเปรดชีตได้ - อัปเดตตัวอย่าง
PreflightReportของ Delphi, C++Builder และ Lazarus ให้สลับพรีวิว CSV และมีคำสั่ง Save CSV ควบคู่กับ workflow เดิมของ TXT / HTML / JSON - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.37
Version 1.39.36
- ขยาย
FPdfPreflightReportด้วยTPdfPreflightReport.IssueCategoryCountsพร้อมชนิดที่นำกลับมาใช้ซ้ำได้อย่างTPdfPreflightIssueCategoryCountและTPdfPreflightIssueCategoryCountsสำหรับรวม issue ระดับ marker ตามหมวดหมู่ - อัปเดต
TPdfPreflightReport.ToText,ToHtmlและToJsonเพื่อให้เอาต์พุต PreflightReport ที่สร้างขึ้นมีสรุปจำนวน issue ตามหมวดหมู่ควบคู่กับแถวรายมาตรฐานและคำแนะนำ issue แบบละเอียด - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.36
Version 1.39.35
- เปลี่ยนชื่อตัวอย่าง
PrintDialogที่ขยายแล้วเป็นPrintPreferencesใน Delphi, C++Builder และ Lazarus เพื่อให้ชื่อตัวอย่างตรงกับ workflow ของ PDF author print preferences, การพิมพ์แบบ N-up, การกรองหน้าคี่ / คู่, grayscale, cell border และ duplex mapping - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.35
Version 1.39.34
- ขยาย
Demo\Delphi\PrintPDFให้รองรับการโหลด PDF แบบ drag-and-drop และบันทึกเอกสารอธิบาย workflow ที่มีอยู่ของDemo\CBuilder\PrintPDFควบคู่กับตัวอย่าง PrintPDF ของ Delphi และ Lazarus - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.34
Version 1.39.33
- เพิ่ม
Demo\CBuilder\SplitViewทำให้ตารางตัวอย่าง SplitView ครบถ้วนทั้ง Delphi, C++Builder และ Lazarus - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.33
Version 1.39.32
- เพิ่ม
Demo\Lazarus\SplitViewเพื่อนำ workflow การเทียบ PDF แบบวางข้างกันมาสู่ Lazarus พร้อมเลย์เอาต์สองหรือสามพาเนล การนำทางตาม active view คำสั่งที่ซิงก์กัน ค่า zoom สำเร็จรูป และการหมุน - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.32
Version 1.39.31
- เพิ่ม
Demo\Lazarus\PrintPDFเพื่อนำ workflow การพิมพ์ PDF มาตรฐานมาสู่ Lazarus พร้อมการนำทางในพรีวิว ช่วงหน้า จำนวนสำเนา โหมด collate ความคืบหน้า และการยกเลิก - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.31
Version 1.39.30
Demo\Lazarus\FontPropertiesช่วยทำให้ตารางตัวอย่าง FontProperties ครบถ้วนทั้ง Delphi, C++Builder และ Lazarus- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.30
Version 1.39.29
Demo\CBuilder\FontPropertiesช่วยให้งานตรวจสอบอักขระแบบ indexed และ metadata ของฟอนต์มีใน C++Builder ควบคู่กับตัวอย่าง Delphi- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.29
Version 1.39.28
- เพิ่ม
Demo\Delphi\ExtractTextPagesทำให้ตารางตัวอย่างการดึงข้อความแยกตามหน้า ครบถ้วนทั้ง Delphi, C++Builder และ Lazarus - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.28
Version 1.39.27
- เพิ่ม
Demo\Lazarus\PrintDialogทำให้ตารางตัวอย่าง PrintDialog ครบถ้วนทั้ง Delphi, C++Builder และ Lazarus - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.27
Version 1.39.26
- เพิ่ม
Demo\CBuilder\PrintDialogเพื่อนำ workflow การพิมพ์แบบ N-up และ PDF author print preferences มาสู่ C++Builder ควบคู่กับตัวอย่าง Delphi - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.26
Version 1.39.25
- เพิ่ม
Demo\CBuilder\ViewerInteractionLabทำให้ตารางตัวอย่าง ViewerInteractionLab ครบถ้วนทั้ง Delphi, C++Builder และ Lazarus - อัปเดต workflow การบิลด์ไลบรารีและเอาต์พุตแพ็กเกจ Win64 ของ C++Builder เพื่อให้เมธอด viewer interaction ของ
TPdfViewลิงก์ได้ถูกต้องในเดโม Win64 - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.25
Version 1.39.24
- เพิ่ม
Demo\Lazarus\ViewerInteractionLabเพื่อนำ workflow ด้าน viewer interaction แบบเจาะจงมาสู่ Lazarus ควบคู่กับตัวอย่าง Delphi - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.24
Version 1.39.23
- เพิ่ม
Demo\Lazarus\SearchAndSelectทำให้ตารางตัวอย่าง SearchAndSelect ครบถ้วนทั้ง Delphi, C++Builder และ Lazarus - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.23
Version 1.39.22
- เพิ่ม
Demo\CBuilder\ContentExtractionLabและDemo\Lazarus\ContentExtractionLabเพื่อนำ workflow การดึงเนื้อหาหลายหมวดหมู่มาสู่เดโม IDE ที่รองรับทั้งหมด - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.22
Version 1.39.21
- ขยาย
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportและDemo\CBuilder\PreflightReportด้วยตัวเลือก format สำหรับพรีวิว เพื่อให้ผู้ใช้ตรวจข้อความหรือเอาต์พุต JSON ได้ก่อนบันทึกรายงาน - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.21
Version 1.39.20
- เพิ่มการส่งออก JSON ให้
FPdfPreflightReportผ่านTPdfPreflightReport.ToJsonและSaveJsonToFileเพื่อสร้างสรุปที่เครื่องอ่านได้ พร้อมสถานะ / priority รายมาตรฐาน next action และรายละเอียด issue - อัปเดต
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportและDemo\CBuilder\PreflightReportให้มีคำสั่ง Save JSON ควบคู่กับการส่งออก TXT / HTML - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.20
Version 1.39.19
- ขยาย
FPdfPreflightReportด้วยTPdfPreflightStatus, หมวดหมู่ issue, priority รายมาตรฐาน และคำแนะนำ next action ในรายงาน TXT / HTML - อัปเดต
Demo\Delphi\PreflightReport,Demo\Lazarus\PreflightReportและDemo\CBuilder\PreflightReportให้แสดง status, priority, จำนวน issue และ next action ในกริดสรุป - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.19
Version 1.39.18
- เพิ่ม
Demo\Lazarus\SecurityAuditทำให้เมทริกซ์เดโมของ Delphi, C++Builder และ Lazarus สำหรับ workflow การ audit พื้นผิวความเสี่ยงของ PDF แบบอ่านอย่างเดียวครบถ้วน - ตัวอย่าง Lazarus จะแสดง permissions, attachments, JavaScript actions, URI / Launch link annotations, web links, signatures, สถานะ XFA, ความพร้อมใช้ของตัวช่วย V8 / XFA และ unsupported-feature callbacks แล้วจึงบันทึกหรือคัดลอกรายการ findings เป็นรายงาน TXT
- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.18
Version 1.39.17
- เพิ่ม
Demo\CBuilder\SecurityAuditเพื่อนำ workflow การ audit พื้นผิวความเสี่ยงของ PDF แบบอ่านอย่างเดียวมาสู่ C++Builder ควบคู่กับตัวอย่าง Delphi เดิม - ตัวอย่าง C++Builder จะแสดง permissions, attachments, JavaScript actions, URI / Launch link annotations, web links, signatures, สถานะ XFA, ความพร้อมใช้ของตัวช่วย V8 / XFA และ unsupported-feature callbacks แล้วจึงบันทึกหรือคัดลอกรายการ findings เป็นรายงาน TXT
- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.17
Version 1.39.16
- เพิ่ม
Demo\CBuilder\SearchAndSelectเพื่อนำ workflow ตัวแสดง SearchAndSelect แบบแยกเดี่ยวมาสู่ C++Builder ควบคู่กับตัวอย่าง Delphi เดิม - ตัวอย่าง C++Builder สามารถสร้างหรือเปิด PDF, แสดงรายการการจับคู่ทุกหน้าพร้อมพรีวิว page / character-index, รองรับ Previous / Next และการนำทางด้วยดับเบิลคลิก พร้อมไฮไลต์การจับคู่บนหน้าปัจจุบันด้วย
HighlightSearchText - นอกจากนี้ยังเปิดให้ใช้
AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboard,ClearSelection,OnSelectionChangeและตัวเลือกDisplayModeแบบ spread โดย metadata เวอร์ชันตอนนี้รายงาน 1.39.16
Version 1.39.15
- เพิ่ม
Demo\CBuilder\WatermarkStampทำให้เมทริกซ์เดโมของ Delphi, Lazarus และ C++Builder สำหรับ workflow ลายน้ำและตราประทับแบบ Form XObject ที่นำกลับมาใช้ซ้ำได้ครบถ้วน - ตัวอย่าง C++Builder สร้าง PDF เป้าหมายและ PDF ตราประทับ, นำหน้าตราประทับกลับมาใช้ผ่าน
CreateXObjectFromPage, ใช้ทรานส์ฟอร์มTPdfMatrixและบันทึกลายน้ำกึ่งกลาง ตราประทับมุม และป้ายหมายเลขหน้า - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.15
Version 1.39.14
- เพิ่ม
Demo\Lazarus\WatermarkStampเพื่อนำ workflow ลายน้ำและตราประทับแบบ Form XObject ที่นำกลับมาใช้ซ้ำได้มาสู่ Lazarus - ตัวอย่าง Lazarus สร้าง PDF เป้าหมายและ PDF ตราประทับ, นำหน้าตราประทับกลับมาใช้ผ่าน
CreateXObjectFromPage, ใช้ทรานส์ฟอร์มTPdfMatrixและบันทึกลายน้ำกึ่งกลาง ตราประทับมุม และป้ายหมายเลขหน้า - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.14
Version 1.39.13
- เพิ่ม
Demo\CBuilder\PreflightReportทำให้เมทริกซ์เดโมของ Delphi, Lazarus และ C++Builder สำหรับ workflowFPdfPreflightReportที่นำกลับมาใช้ซ้ำได้ครบถ้วน - ตัวอย่าง C++Builder ใช้
FPdfPreflightReport.hppเพื่อสร้างสรุปรายมาตรฐาน พรีวิวรายงาน TXT ไฟล์รายงาน TXT / HTML และพฤติกรรม Open Last Report - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.13
Version 1.39.12
- เพิ่ม
Demo\Lazarus\PreflightReportเพื่อนำ workflow รายงาน preflight ของ PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R และ PDF/VT มาสู่ Lazarus - ตัวอย่าง Lazarus สามารถเปิดหรือสร้าง PDF, เลือกมาตรฐานเป้าหมาย, พรีวิวแถวสรุปและเอาต์พุตรายงาน TXT, บันทึกรายงาน TXT / HTML และเปิดรายงานที่เพิ่งบันทึกล่าสุดได้
- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.12
Version 1.39.11
- ขยาย
Demo\Delphi\SearchAndSelectด้วยรายการผลการค้นหาทุกหน้าที่บันทึกหมายเลขหน้า ดัชนีอักขระ และข้อความพรีวิว - เพิ่มการนำทางการจับคู่แบบ Previous / Next และการกระโดดผลลัพธ์ด้วยดับเบิลคลิก โดยยังคงพฤติกรรม
HighlightSearchTextของหน้าปัจจุบันไว้ - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.11
Version 1.39.10
- ขยาย
Demo\Delphi\SecurityAuditด้วยคำสั่ง Save Report และ Copy Report ที่ส่งออกสรุปปัจจุบันและแถว findings เป็นรายงาน audit แบบ TXT - เดโมตอนนี้จะล้างสถานะการส่งออกรายงานเมื่อรีเซ็ตแผง audit ทำให้รายงานที่คัดลอกหรือบันทึกไว้ยังสอดคล้องกับ findings ที่มองเห็นอยู่
- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.10
Version 1.39.9
- ขยาย
Demo\Delphi\ContentExtractionLabด้วยการบันทึก source PDF การคัดลอกรายงานไปคลิปบอร์ด และคำสั่งเลือกหมวดหมู่ทั้งหมด / ไม่เลือกเลย - เดโมตอนนี้จะทำให้รายงานปัจจุบันเป็นโมฆะเมื่อการเลือกหมวดหมู่เปลี่ยนไป เพื่อให้การส่งออก TXT / JSON สะท้อนขอบเขตการดึงข้อมูลที่มองเห็นอยู่
- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.9
Version 1.39.8
- เพิ่ม
Demo\Delphi\ContentExtractionLabซึ่งเป็นตัวอย่าง workflow การดึงเนื้อหาแบบรวมศูนย์สำหรับ document metadata, page text, page objects, images, attachments, links, annotations, bookmarks และ metrics ของฟอนต์ / อักขระ - ตัวอย่างนี้สามารถเปิด PDF ที่มีอยู่หรือสร้าง PDF สังเคราะห์ที่มีข้อความ รูปภาพ ไฟล์แนบ และ annotation จากนั้นจึงสร้างแถวสรุปและรายงาน TXT / JSON แบบละเอียดได้
- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.8
Version 1.39.7
- เพิ่ม
Lib\FPdfPreflightReport.pasซึ่งเป็นตัวช่วยรายงานที่นำกลับมาใช้ซ้ำได้ โดยครอบValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfRและValidatePdfVTไว้ในอ็อบเจ็กต์TPdfPreflightReportเดียว - เพิ่ม
Demo\Delphi\PreflightReportซึ่งเป็นตัวอย่าง workflow ที่เปิดหรือสร้าง PDF, เลือกมาตรฐานเป้าหมาย, พรีวิวแถวสรุปและคำแนะนำ issue และบันทึกรายงาน TXT หรือ HTML - รายงานที่สร้างขึ้นอธิบายขอบเขตการตรวจสอบระดับ marker ที่มีมาในตัวอย่างชัดเจน เพื่อให้แอปพลิเคชันจับคู่กับเครื่องมือ preflight ระดับเนื้อหาโดยเฉพาะได้เมื่อจำเป็น
- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus, รายการ package project และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.7
Version 1.39.6
- เพิ่ม
Demo\Delphi\SearchAndSelectซึ่งเป็นตัวอย่าง workflow ของตัวแสดงแบบเจาะจงสำหรับการไฮไลต์ผลค้นหา การเลือกข้อความ พรีวิวข้อความที่เลือก การคัดลอก การล้าง และโหมดแสดงผลแบบ spread - ตัวอย่างนี้สาธิต
HighlightSearchText, ตัวเลือกค้นหา match-case / whole-word,AllowUserTextSelection,SelectedText,SelectAll,CopySelectionToClipboardและClearSelectionโดยไม่ต้องเพิ่ม API ใหม่ให้ไลบรารี - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.6
Version 1.39.5
- ขยาย
Demo\Delphi\ViewerInteractionLabให้เป็นตัวอย่าง UX ของตัวแสดงแบบ SearchAndSelect ที่มีHighlightSearchText, ตัวเลือก match-case / whole-word, พรีวิวข้อความที่เลือก และตัวควบคุมการเลือก / คลิปบอร์ดที่มีอยู่เดิม - ขยาย
Demo\Delphi\PrintDialogให้ตรวจสอบ PDF author print preferences ได้แก่PrintCopies,PrintPageRanges,PrintScaling,PrintPaperHandlingและการแมป duplex ผ่านSetPdfPrintPaperHandlingDevModeที่มองเห็นได้ - เพิ่ม
Demo\Delphi\SecurityAuditซึ่งเป็นตัวอย่างพื้นผิวความเสี่ยงแบบอ่านอย่างเดียวที่แสดง permissions, attachments, document JavaScript, URI / Launch links, web links, signatures, สถานะ XFA และความพร้อมใช้ของตัวช่วย V8 / XFA - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.5
Version 1.39.4
- เพิ่ม
Demo\CBuilder\ImageToPDFและDemo\Lazarus\ImageToPDFทำให้ตารางตัวอย่าง ImageToPDF ครบถ้วนทั้ง Delphi, C++Builder และ Lazarus - ตัวอย่างใหม่สาธิตการเลือกรูปหลายรูป พรีวิวรูปที่เลือก การสร้างหนึ่งหน้า PDF ต่อหนึ่งรูป การกำหนดขนาดหน้า A4 แนวตั้ง / แนวนอน การปรับสเกลรูปให้อยู่กึ่งกลาง ความคืบหน้ารายรูป และการเปิด PDF ที่สร้างหลังบันทึกเสร็จ
- อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.4
Version 1.39.3
- เพิ่ม
Demo\CBuilder\BatchExportเพื่อนำ workflow การส่งออก PDF หลายไฟล์เป็น JPG มาสู่ C++Builder ควบคู่กับตัวอย่าง Delphi และ Lazarus ที่มีอยู่เดิม - ตัวอย่างนี้สาธิต
LoadCustomDocument,IPdfCancellationTokenSource, อินพุตTFileStreamแบบสตรีม, ความคืบหน้ารายไฟล์และรายหน้า, การจัดการการยกเลิก, อินพุต DPI / quality / password และการเปิดโฟลเดอร์ผลลัพธ์หลังเสร็จสิ้น - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.3
Version 1.39.2
- เพิ่ม
Demo\Delphi\WatermarkStampซึ่งเป็นตัวอย่าง workflow แบบ Form XObject ที่รันได้จริง โดยสร้าง PDF เป้าหมายและ PDF ตราประทับที่นำกลับมาใช้ซ้ำได้ จากนั้นจึงใส่ลายน้ำกึ่งกลาง ตราประทับมุมขวาบน และป้ายหมายเลขหน้าในทุกหน้า - ตัวอย่างนี้สาธิต
CreateXObjectFromPage,InsertFormObjectFromXObject,TPdfMatrixและFPDFPageObj_SetMatrixโดยไม่ต้องเพิ่ม API ใหม่ให้ไลบรารี - อัปเดต
Docs\en-us\Examples.htmlให้ใช้รูปแบบTPdfMatrix.Handleปัจจุบันเมื่อส่ง matrices ไปยังFPDFPageObj_SetMatrix - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.2
Version 1.39.1
- เพิ่ม
Demo\Delphi\ViewerInteractionLabซึ่งเป็นตัวอย่างTPdfViewแบบเจาะจงสำหรับ display modes, fit modes, page colors, การหมุน, การเลือกข้อความโดยผู้ใช้, คำสั่งคลิปบอร์ด และข้อมูลพิกัดย้อนกลับจากDeviceToPage - เพิ่ม
Demo\CBuilder\StandardsLab/Demo\Lazarus\StandardsLabเพื่อให้ผู้ใช้ Lazarus สามารถรัน workflow การตรวจสอบและการส่งออก marker ของ PDF/A, PDF/UA, PDF/E, PDF/X, PDF/R และ PDF/VT ได้ - เพิ่มรายการ units ด้านมาตรฐานใน
Lib\37.0\PDFiumPas.dprojและLib\FPC\PDFiumLaz.lpkพร้อมแก้การบิลด์เดโมSplitViewของ Delphi โดยลบ importWinapi.ShellAPIที่ซ้ำออก - แก้ตัวบล็อกการบิลด์เดโมแบบแบตช์ของ Delphi ใน
BatchExport,PDFViewer,MultiPageViewerและSplitViewโดยไม่เปลี่ยนพฤติกรรมขณะรัน - แก้ความเข้ากันได้ของการบิลด์เดโมแบบแบตช์ใน C++Builder สำหรับ
PDFViewerและMultiPageViewerโดยแทนที่nullptrด้วยNULLให้ตรงกับโหมดโปรเจ็กต์ปัจจุบัน - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.1
Version 1.39.0
- เพิ่ม
Demo\Delphi\StandardsLabซึ่งเป็นตัวอย่าง workflow ด้านมาตรฐานที่รันได้จริง โดยโหลดหรือสร้าง PDF, รันValidatePdfA,ValidatePdfUa,ValidatePdfE,ValidatePdfX,ValidatePdfRและValidatePdfVTแล้วแสดง conformance ที่ตรวจพบ สถานะผ่าน/ไม่ผ่าน และจำนวน issue ในกริดเดียว - ปุ่มบันทึกของ StandardsLab จะเรียก
SaveAsPdfA,SaveAsPdfUa,SaveAsPdfE,SaveAsPdfX,SaveAsPdfRและSaveAsPdfVTทำให้มองเห็นเอาต์พุต marker ของมาตรฐาน PDF ได้โดยไม่ต้องเขียน harness เอง - อัปเดต
TPdf.AboutInfo, metadata ของแพ็กเกจ Lazarus และ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.39.0
Version 1.38.0
- โอเวอร์เลย์การค้นหาและการเลือกข้อความของ
TPdfViewตอนนี้ใช้ alpha blending จริงแทนการวาดด้วย logical mask จึงคงเนื้อหาหน้าไว้ใต้ไฮไลต์ได้ - เพิ่ม
SetPdfPrintPaperHandlingDevModeเพื่อแมปTPrintPaperHandlingไปเป็นค่า WindowsDEVMODE.dmDuplexได้แก่DMDUP_SIMPLEX,DMDUP_HORIZONTALและDMDUP_VERTICAL TPdfView.SmoothScrollตอนนี้แสดงแอนิเมชันคำสั่ง scrollbar แบบ line/page เป็นช่วงที่ขับด้วย timer ส่วนการติดตาม thumb ยังตอบสนองทันทีเหมือนเดิม- อัปเดต
TPdf.AboutInfoและ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.38.0
Version 1.37.0
TPdfตอนนี้มี render lock แยกต่อ instance ที่ทำให้เส้นทางRenderPage,RenderTile,RenderPageProgressive, การ reload หน้า และการ unload เอกสารถูกจัดลำดับแบบอนุกรม การเรนเดอร์ด้วย worker ผ่านคอมโพเนนต์ที่ใช้ร่วมกันจึงใช้งานได้จริงมากขึ้น แม้แอปยังต้องประสานการเปลี่ยนแปลงและอายุของเอกสารเองอยู่- แก้ zero-copy bitmap wrapper ให้ปฏิเสธเลย์เอาต์ DIB ของ
TBitmapแบบ bottom-up และถอยกลับไปใช้บัฟเฟอร์ที่ PDFium เป็นเจ้าของก่อนคัดลอกออก ช่วยกำจัดปัญหา stride-corruption / access-violation ในการทดสอบ render ของ VCL - กระชับพฤติกรรมการเลือกของ
TPdfViewให้ชัดขึ้น:AllowUserTextSelectionควบคุมเฉพาะอินพุตจากผู้ใช้, API การเลือกระดับโค้ดยังวาดได้ตามเดิม และSelectAllจะอิง spread ที่มองเห็นจริง ทำให้หน้าปกไม่เลือกหน้า 2 อีกต่อไป โดยได้ขยายการทดสอบของ Delphi, Lazarus และ C++Builder ให้ครอบคลุมตามนี้แล้ว - อัปเดต
TPdf.AboutInfoและ metadata เวอร์ชันของตัวติดตั้งให้รายงาน 1.37.0
Version 1.36.0
- เปิดใช้งานการเลือกข้อความของผู้ใช้ปลายใน
TPdfView— คุณสมบัติAllowUserTextSelectionที่สงวนไว้ตั้งแต่ v1.17.0 ตอนนี้ขับเคลื่อนกระบวนการลากเลือกได้ครบชุดแล้ว คลิกซ้ายบนอักขระข้อความจะเข้าสู่โหมดเลือก (hit-test auto) ส่วนคลิกซ้ายบนพื้นที่ว่างยังคงแพนต่อไปตามเดิม โมดูลกรอกแบบฟอร์มยังคงมีลำดับความสำคัญ ดังนั้นการคลิกที่ช่องฟอร์มยังคงโฟกัสช่องนั้นแทนที่จะเริ่มการเลือก - ดับเบิลคลิกเลือกคำ ทริปเปิลคลิกเลือกบรรทัด
Ctrl+Aเลือกหน้าปัจจุบัน (ทั้งสองหน้าในโหมดแสดงแบบ spread) และCtrl+Cคัดลอกส่วนที่เลือกไปยังคลิปบอร์ดของ Windows เป็นCF_UNICODETEXT Shift+Left/Shift+Rightขยายการเลือกทีละอักขระ (และล้ำไปยังหน้าข้างเคียงในโหมด spread);Shift+Home/Shift+Endขยายไปจนถึงขอบบรรทัดที่มองเห็น โดยใช้ความสูงของกรอบอักขระตั้งต้นเป็นค่าคลาดเคลื่อนของการจับกลุ่มบรรทัด จึงทำให้บรรทัดที่มีขนาดฟอนต์ผสมยังคงถูกจัดกลุ่มได้ถูกต้อง- เมื่อเลื่อนเมาส์เหนือข้อความ เคอร์เซอร์จะเปลี่ยนเป็น
crIBeamและเมื่อเลื่อนออกจากข้อความจะกลับเป็นเคอร์เซอร์เริ่มต้น ระหว่างการลากเลือกข้อความ หากลากเข้าไปในเขตตาย 20 พิกเซลที่ขอบตัวแสดงผลใด ๆ ระบบจะเลื่อนหน้าอัตโนมัติ (รอบ 50 ms, 16 px / tick, จำกัดอยู่ภายในขอบเดียวกับเส้นทางการแพน) เพื่อให้การเลือกขยายเลยขอบมุมมองปัจจุบันได้โดยไม่ต้องปล่อยเมาส์ก่อน - การเลือกข้ามหน้าใช้งานได้ในโหมดแสดงแบบ spread (
dmTwoPageContinuous,dmTwoPageContinuousWithCover): การลากที่เริ่มจากหน้าซ้ายและจบที่หน้าขวาจะเลือกช่วงต่อเนื่องที่ครอบคลุมทั้งสองหน้าSelectedTextจะเชื่อมส่วนข้อความของแต่ละหน้าด้วย CR/LF ทำให้ข้อความที่อ่านกลับมามีลักษณะเหมือนเนื้อหาหลายบรรทัดตามปกติ - เพิ่มคุณสมบัติที่เผยแพร่ใหม่
SelectionColor(ค่าเริ่มต้นclHighlightซึ่งเป็นสีเลือกของระบบ Windows) — แยกจากHighlightColorที่ใช้ทำสีผลการค้นหาเป็นสีเหลือง สามารถแสดงไฮไลต์ของการค้นหาและการลากเลือกที่กำลังใช้งานอยู่บนหน้าจอพร้อมกันได้โดยไม่ชนกันของสี - อีเวนต์ที่เผยแพร่ใหม่
OnSelectionChangeจะทำงานทุกครั้งที่ช่วงที่ถูกสร้างขึ้นแล้วของการเลือกเปลี่ยนจริง ๆ — ไม่ทำงานซ้ำเมื่อมีการนำค่าเดิมมาใช้ใหม่ จึงทำให้แอป host ผูกเข้ากับข้อความแถบสถานะหรือสถานะเปิดใช้งานของปุ่มได้โดยตรงโดยไม่ต้อง debounce - API สาธารณะใหม่บน
TPdfView:HasSelection,SelectionCharCount,SelectedText,ClearSelection,SelectAll,CopySelectionToClipboardรายการเหล่านี้เป็นจุดเรียกใช้งานระดับโค้ดและจะทำงานเสมอไม่ว่าAllowUserTextSelectionจะเป็นค่าใด — แฟลกนี้ใช้ควบคุมเฉพาะอินพุตจากผู้ใช้ (เมาส์, Ctrl+C, Ctrl+A, Shift+arrows) ดังนั้นโฮสต์แบบ kiosk จึงปิดการเลือกที่ผู้ใช้ทำเองได้ ขณะเดียวกันก็ยังสร้างปุ่มแถบเครื่องมือ "Select All / Copy" ที่เรียก API เดียวกันได้ - เมนูป๊อปอัปเริ่มต้นสำหรับคลิกขวา
Copy/复制จะถูกแนบอัตโนมัติเมื่อโฮสต์ยังไม่ได้กำหนดPopupMenuของตัวเอง — รูปแบบมาตรฐาน "select text, right-click, copy" ใช้งานได้ทันที ชื่อคำบรรยายจะเลือกเป็นภาษาอังกฤษหรือจีนตามSysLocale.PriLangID; โฮสต์ที่ต้องการการแปลเต็มรูปแบบ (หรือเมนูที่ครบกว่า) เพียงกำหนดPopupMenuของตนเอง แล้วค่าเริ่มต้นจะถูกระงับ - ระบบจะล้างการเลือกโดยอัตโนมัติเมื่อมีการเรียก
SetPdf,SetPageNumber,SetActive(False)และเมื่อมีการเปลี่ยนDisplayModeโดยOnSelectionChangeจะทำงานเพียงครั้งเดียวเมื่อการเลือกก่อนหน้ามีข้อมูลจริง โมดูลกรอกแบบฟอร์มยังคงมีลำดับความสำคัญ — ขณะที่กำลังแก้ไขช่องฟอร์ม คีย์ลัดการเลือกทั้งหมดจะรอให้ช่องนั้นรับCtrl+C/Ctrl+A/Shift+arrowsไปใช้กับการเลือกของช่องเอง - ขยายชุด regression ของ Delphi และ Lazarus เป็น 202 เคสต่อชุด และของ C++Builder เป็น 159 เคส ครอบคลุมค่าเริ่มต้น การรับส่งกลับ พฤติกรรม public API การล้างเมื่อสถานะเปลี่ยน การลากเมาส์ (hit-text / hit-blank) การคลิกเทียบกับการลาก การสลับเคอร์เซอร์ IBeam การดับเบิลคลิกเลือกคำ การทริปเปิลคลิกเลือกบรรทัด คีย์ลัด การแนบ / การเลื่อน / คำบรรยายของเมนูป๊อปอัปเริ่มต้น และการเลือกข้ามหน้าแบบ spread — รวมถึงการตรวจสอบการรับส่งกลับของ clipboard ผ่าน CR/LF
Version 1.35.0
- เพิ่มการ inject marker สำหรับ PDF/VT (ISO 16612-2:2010): TPdf.SaveAsPdfVT จะยกระดับเอกสารปัจจุบันให้เป็นไฟล์ที่สอดคล้องกับ PDF/VT-1 หรือ PDF/VT-2 โดย PDF/VT สร้างบน PDF/X-4 ดังนั้นตัว injector จึงเขียนชุด marker ของ PDF/X-4 ครบชุด (XMP
pdfxid:GTS_PDFXVersion = "PDF/X-4", Info/GTS_PDFXVersion (PDF/X-4)และ/Trapped, catalog/OutputIntentsที่อ้างถึง OutputIntent dictionary พร้อม embedded ICC profile) ควบคู่กับคุณสมบัติเฉพาะของ PDF/VT - การ inject เฉพาะ PDF/VT ครอบคลุม XMP
pdfvtid:GTS_PDFVTVersion(= "PDF/VT-1" หรือ "PDF/VT-2" ตาม §6.3 Table 2) และpdfvtid:GTS_PDFVTModDateที่ซิงก์กับxmp:ModifyDateพร้อมคำอธิบาย pdfaExtension:schemas ที่ประกาศทั้ง namespace ของ pdfxid และ pdfvtid (NPES URIshttp://www.npes.org/pdfx/ns/id/และhttp://www.npes.org/pdfvt/ns/id/) ส่วน trailer จะมีอาร์เรย์/ID - เพิ่ม TPdf.SaveAsPdfVTToStream สำหรับเอาต์พุต PDF/VT ในหน่วยความจำ และ shorthand ตัวเลือกเริ่มต้น
TPdf.SaveAsPdfVT(FileName)ที่สร้าง PDF/VT-1 พร้อม OutputIntent แบบ sRGB IEC61966-2.1 ที่บันเดิลมาและ/Trapped /False - เพิ่ม TPdf.ValidatePdfVT เพื่อตรวจ marker ความสอดคล้องของ PDF/VT ใน PDF ที่เปิดอยู่ รวมถึงการมีอยู่ของ XMP
pdfvtid:GTS_PDFVTVersionและGTS_PDFVTModDate, การเท่ากันระหว่างpdfvtid:GTS_PDFVTModDateกับxmp:ModifyDate, การมีอยู่ของตัวระบุพื้นฐานpdfxid:GTS_PDFXVersion, การมีอยู่ของ/DPartRootใน catalog ตาม §6.5,/OutputIntentsที่มี/DestOutputProfile, trailer /ID, สถานะการเข้ารหัส และการมีอยู่ของxmp:CreateDate/ModifyDateแล้วคืน TPdfVTValidationResult พร้อมระดับ conformance ที่ตรวจพบและชุด issue ที่พบ - เพิ่มคุณสมบัติ TPdf.PdfVTConformance ที่คืนระดับ conformance ของเอกสารที่เปิดอยู่ในขณะนั้น (pvc1, pvc2, pvcNone หรือ pvcUnknown) โดยไม่ต้องเรียก ValidatePdfVT โดยตรง
- ส่งออกชนิดใหม่ในยูนิตใหม่ FPdfPdfvt ได้แก่ TPdfVTConformance (pvcUnknown/None/1/2), TPdfVTTrappedState (ptvUnspecified/True/False/Unknown), TPdfVTValidationResult, TPdfVTValidationIssue และ TPdfVTSaveOptions
- Document Part Hierarchy (
DPartRoot/DParttree ตาม §6.5) เป็นโครงสร้างระดับแอปพลิเคชันที่ขึ้นกับการแมปรับผู้รับ / ช่วงหน้าของ workflow งานพิมพ์ variable-data ดังนั้น SaveAsPdfVT จะไม่สร้าง DPart tree ให้เอง และ ValidatePdfVT จะรายงานการขาด/DPartRootเป็นpvviMissingDPartRootเพื่อให้ผู้เรียกส่งไฟล์ PDF/VT ไปยังขั้นตอนสร้าง DPart แยกต่างหาก ส่วนข้อกำหนดระดับเนื้อหาของ PDF/X-4 ยังเป็นความรับผิดชอบของผู้สร้างเอกสารและ pipeline การเรนเดอร์ของ PDFium - อัปเดตสตริง TPdf.AboutInfo ให้รายงานเวอร์ชันผลิตภัณฑ์ปัจจุบัน
Version 1.34.0
- เพิ่มการ inject marker สำหรับ PDF/R-1 (ISO 23504-1:2020): TPdf.SaveAsPdfR จะยกระดับเอกสารปัจจุบันให้เป็นไฟล์ที่สอดคล้องกับ PDF/R-1 โดยการ inject ครอบคลุมข้อกำหนดระดับรูปแบบไฟล์ที่ติดเพิ่มได้ด้วย post-processing รวมถึงคอมเมนต์ระบุเวอร์ชัน
%PDF-raster-1.0, catalog และ Info dictionary ที่ถูกลดลงตาม white list, สตรีม XMP ใน /Metadata และอาร์เรย์ /ID ใน trailer - เพิ่ม TPdf.SaveAsPdfRToStream สำหรับเอาต์พุต PDF/R ในหน่วยความจำ และ shorthand ตัวเลือกเริ่มต้น
TPdf.SaveAsPdfR(FileName)สำหรับกรณีทั่วไป - เพิ่ม TPdf.ValidatePdfR เพื่อตรวจ marker ความสอดคล้องของ PDF/R-1 ใน PDF ที่เปิดอยู่ รวมถึงคอมเมนต์ท้ายไฟล์
%PDF-raster-x.yแล้วคืน TPdfRValidationResult พร้อมระดับ conformance ที่ตรวจพบและชุด issue ที่พบ - เพิ่มคุณสมบัติ TPdf.PdfRConformance ที่คืนระดับ conformance ของเอกสารที่เปิดอยู่ในขณะนั้น (prc1, prcNone หรือ prcUnknown) โดยไม่ต้องเรียก ValidatePdfR โดยตรง
- ส่งออกชนิดใหม่ในยูนิตใหม่ FPdfPdfr ได้แก่ TPdfRConformance, TPdfRValidationResult, TPdfRValidationIssue และ TPdfRSaveOptions โดย
TPdfRSaveOptions.Defaultจะตั้งค่า StripInfoOptionalEntries และ StripCatalogOptionalEntries เป็น True เพื่อให้ค่าเริ่มต้นสอดคล้องกับ §6.3 / §6.4.3 - ข้อกำหนดระดับเนื้อหาของ PDF/R ยังคงเป็นความรับผิดชอบของ PDF ต้นฉบับ รวมถึงรูปแบบ MediaBox
[0 0 w h]และกฎอื่น ๆ ที่บังคับใช้ด้วย post-processing ไม่ได้ ดังนั้นควรใช้ ValidatePdfR ควบคู่กับตัวตรวจ PDF/R ของ TWAIN Working Group เมื่อต้องการตรวจระดับเนื้อหาเต็มรูปแบบ - อัปเดตสตริง TPdf.AboutInfo ให้รายงานเวอร์ชันผลิตภัณฑ์ปัจจุบัน
Version 1.33.0
- เพิ่มการ inject marker สำหรับ PDF/X (ตระกูล ISO 15930): TPdf.SaveAsPdfX จะยกระดับเอกสารปัจจุบันให้เป็นไฟล์ที่สอดคล้องกับ PDF/X-1a:2001, PDF/X-3:2002 หรือ PDF/X-4 โดย post-process PDF พื้นฐานด้วย incremental update ซึ่งจะเขียนสตรีม XMP metadata ที่มี
pdfxid:GTS_PDFXVersion(และpdfxid:GTS_PDFXConformanceสำหรับ PDF/X-1a / PDF/X-3), Document Information Dictionary ที่มี/GTS_PDFXVersion,/GTS_PDFXConformanceและ/Trapped, catalog ที่มี/OutputIntents [N 0 R]อ้างถึง OutputIntent dictionary พร้อม/S /GTS_PDFXและ embedded ICC profile ตลอดจนอาร์เรย์/IDใน trailer ให้ครบตามข้อกำหนดระดับรูปแบบไฟล์ที่เพิ่มได้ในขั้นตอนนี้ - เพิ่ม TPdf.SaveAsPdfXToStream สำหรับเอาต์พุต PDF/X ในหน่วยความจำ และ shorthand ตัวเลือกเริ่มต้น
TPdf.SaveAsPdfX(FileName)ที่สร้าง PDF/X-4 พร้อม OutputIntent แบบ sRGB IEC61966-2.1 ในตัว - เพิ่ม TPdf.ValidatePdfX เพื่อตรวจ marker ความสอดคล้องของ PDF/X ใน PDF ที่เปิดอยู่ แล้วคืน TPdfXValidationResult พร้อมระดับที่ตรวจพบและชุด issue ที่พบ
- เพิ่มคุณสมบัติ TPdf.PdfXConformance ที่คืนระดับ conformance ของเอกสารที่เปิดอยู่ในขณะนั้น (pxc1a, pxc3, pxc4, pxcNone หรือ pxcUnknown) โดยไม่ต้องเรียก ValidatePdfX โดยตรง
- ส่งออกชนิดใหม่ในยูนิตใหม่ FPdfPdfx ได้แก่ TPdfXConformance, TPdfXTrappedState, TPdfXValidationResult, TPdfXValidationIssue และ TPdfXSaveOptions โดย
TPdfXSaveOptions.Defaultจะตั้งเป้าเป็น PDF/X-4 พร้อม sRGB OutputIntent และ/Trapped /Falseและยังเปิดให้ผู้เรียก override ค่าConformance,IccProfileDataแบบ CMYK หรือค่าOutputCondition,OutputConditionIdentifierและRegistryNameของ registry เฉพาะงานพิมพ์ได้ - ข้อกำหนดระดับเนื้อหา เช่น การฝังฟอนต์ทั้งหมด, การไม่มี JavaScript, ข้อห้าม OPI และกฎ transparency สำหรับ PDF/X-1a / PDF/X-3 ยังคงเป็นความรับผิดชอบของผู้สร้างเอกสารและ pipeline การเรนเดอร์ของ PDFium
- อัปเดตสตริง TPdf.AboutInfo ให้รายงานเวอร์ชันผลิตภัณฑ์ปัจจุบัน
Version 1.32.0
- เพิ่มการ inject marker สำหรับ PDF/E-1 (ISO 24517-1:2008): TPdf.SaveAsPdfE จะยกระดับเอกสารปัจจุบันให้เป็นไฟล์ที่สอดคล้องกับ PDF/E-1 โดย post-process PDF พื้นฐานด้วย incremental update ซึ่งจะเขียนสตรีม XMP metadata ที่มี
pdfe:ISO_PDFEVersion = "PDF/E-1", Document Information Dictionary ที่มี/ISO_PDFEVersion (PDF/E-1)และอาร์เรย์/IDใน trailer ให้ตรงกับข้อกำหนดระดับรูปแบบไฟล์ - เพิ่ม TPdf.SaveAsPdfEToStream สำหรับเอาต์พุต PDF/E ในหน่วยความจำ และ shorthand ตัวเลือกเริ่มต้น
TPdf.SaveAsPdfE(FileName)สำหรับกรณีทั่วไป - เพิ่ม TPdf.ValidatePdfE เพื่อตรวจ marker ความสอดคล้องของ PDF/E-1 ใน PDF ที่เปิดอยู่ แล้วคืนผลแบบมีโครงสร้างพร้อมระดับ conformance ที่ตรวจพบและชุด issue ที่พบ
- เพิ่มคุณสมบัติ TPdf.PdfEConformance ที่คืนระดับ conformance ของเอกสารที่เปิดอยู่ในขณะนั้น (pec1, pecNone หรือ pecUnknown) โดยไม่ต้องเรียก ValidatePdfE โดยตรง
- ส่งออกชนิดใหม่ในยูนิตใหม่ FPdfPdfe ได้แก่ TPdfEConformance, TPdfEValidationResult, TPdfEValidationIssue และ TPdfESaveOptions
- การ rewrite Info dictionary ในเส้นทางนี้จะใช้ object number เดิมเมื่อมีอยู่ และจะสร้าง Info dictionary ใหม่เมื่อไฟล์ต้นฉบับไม่มีรายการ /Info อยู่ก่อน
- ข้อกำหนดระดับเนื้อหา เช่น การฝังฟอนต์, ToUnicode CMaps และคุณลักษณะที่ถูกห้ามอื่น ๆ ยังคงเป็นความรับผิดชอบของผู้สร้างเอกสาร เพราะ SaveAsPdfE จะแนบเฉพาะ marker ระดับรูปแบบไฟล์โดยไม่แก้เนื้อหาหน้า
- อัปเดตสตริง TPdf.AboutInfo ให้รายงานเวอร์ชันผลิตภัณฑ์ปัจจุบัน
Version 1.31.0
- เพิ่มการ inject marker สำหรับ PDF/UA-1 (ISO 14289-1:2014): TPdf.SaveAsPdfUa จะยกระดับเอกสารปัจจุบันให้เป็นไฟล์ที่สอดคล้องกับ PDF/UA-1 โดย post-process PDF พื้นฐานด้วย incremental update ซึ่งจะเขียนสตรีม XMP metadata ที่มี
pdfuaid:part = 1, ค่าdc:titleที่บังคับใช้ได้, ค่าใน catalog/MarkInfo << /Marked true /Suspects false >>และ/ViewerPreferences << /DisplayDocTitle true >>, ค่า/Langที่เกี่ยวข้อง และอาร์เรย์/IDใน trailer ให้ตรงกับข้อกำหนดระดับรูปแบบไฟล์ที่บังคับใช้ได้ในขั้นตอนนี้ - เพิ่ม TPdf.SaveAsPdfUaToStream สำหรับเอาต์พุต PDF/UA ในหน่วยความจำ และ shorthand ตัวเลือกเริ่มต้น
TPdf.SaveAsPdfUa(FileName)สำหรับกรณีทั่วไป - เพิ่ม TPdf.ValidatePdfUa เพื่อตรวจ marker ความสอดคล้องของ PDF/UA-1 ใน PDF ที่เปิดอยู่ แล้วคืนผลแบบมีโครงสร้างพร้อมระดับ conformance ที่ตรวจพบและชุด issue ที่พบ
- เพิ่มคุณสมบัติ TPdf.PdfUaConformance ที่คืนระดับ conformance ของเอกสารที่เปิดอยู่ในขณะนั้น (puc1, pucNone หรือ pucUnknown) โดยไม่ต้องเรียก ValidatePdfUa โดยตรง
- ส่งออกชนิดใหม่ในยูนิตใหม่ FPdfPdfua ได้แก่ TPdfUaConformance, TPdfUaValidationResult, TPdfUaValidationIssue และ TPdfUaSaveOptions
- ฟิลด์ Title / Author / Subject / Keywords / Creator / Producer / CreationDate / ModDate / DocumentId / InstanceId / Language ที่ปล่อยว่างไว้ใน TPdfUaSaveOptions จะถูกเติมให้อัตโนมัติจาก FPDF_GetMetaText / FPDF_GetFileIdentifier / FPDFCatalog_GetLanguage ทำให้ผู้เรียกเดิมยังบันทึกได้ด้วยโค้ดเพียงบรรทัดเดียว
- ข้อกำหนดระดับเนื้อหา เช่น ความครบถ้วนของการแท็ก StructTreeRoot, Figure Alt text, ToUnicode CMaps และการฝังฟอนต์ ยังคงเป็นความรับผิดชอบของผู้สร้างเอกสาร เพราะ SaveAsPdfUa จะแนบ marker ระดับรูปแบบไฟล์แต่ไม่แก้เนื้อหาหน้าและไม่สร้างแท็กใหม่ขึ้นเอง โดย ValidatePdfUa จะรายงานการไม่มี StructTreeRoot เป็น
pvuaiMissingStructTreeRoot - อัปเดตสตริง TPdf.AboutInfo ให้รายงานเวอร์ชันผลิตภัณฑ์ปัจจุบัน
Version 1.30.0
- เอาต์พุต PDF/A-1b ตอนนี้เป็นไปตามข้อกำหนด ISO 19005-1 (พร้อม Cor.1:2007) สำหรับความสอดคล้องระหว่าง Document Information Dictionary และ XMP: รายการ Info dictionary ทุกตัวที่ PDFium เขียนลงใน PDF ต้นฉบับจะถูกสะท้อนเข้าไปในแพ็กเกจ XMP รวมถึง Title (dc:title), Author (dc:creator), Subject (dc:description ตาม Cor.1), Keywords (pdf:Keywords), Creator (xmp:CreatorTool), Producer (pdf:Producer), CreationDate (xmp:CreateDate) และ ModDate (xmp:ModifyDate) โดยจะส่งออก xmp:MetadataDate ด้วย
- trailer ของเอกสาร PDF/A ตอนนี้จะมีอาร์เรย์ /ID เสมอ และเมื่อ TPdf.SaveAsPdfA ประมวลผลเอกสารที่ต้นฉบับมี file identifier อยู่แล้ว ก็จะนำ permanent ID และ changing ID แบบ 16-byte เดิมกลับมาใช้ มิฉะนั้นจะสร้าง fallback ID แบบกำหนดได้แน่นอนจาก source bytes
- XMP ที่ inject ตอนนี้ฝังคำอธิบาย extension schema ของ pdfaid ตามที่ ISO 19005-1 6.7.8 กำหนดไว้ ทำให้ไฟล์ที่สอดคล้องต้องประกาศชื่อพร็อพเพอร์ตี ชนิดค่า และหมวดหมู่ไว้ในคอนเทนเนอร์ pdfaExtension:schemas
- TPdfASaveOptions เพิ่มฟิลด์ทางเลือกใหม่ 5 รายการ ได้แก่ Producer, CreationDate, ModDate, DocumentId และ InstanceId โดย TPdf.SaveAsPdfA / SaveAsPdfAToStream จะเติมฟิลด์ที่ยังขาดจาก FPDF_GetMetaText และ FPDF_GetFileIdentifier โดยอัตโนมัติ
- TPdf.ValidatePdfA / TPdf.PdfAConformance ตอนนี้รายงาน issue เพิ่มอีก 3 รายการ คือ pvaiMissingTrailerId, pvaiMissingXmpDates และ pvaiMissingExtensionSchema
- อักขระที่ไม่ใช่ ASCII ใน Title, Author, Subject, Keywords, Creator และ Producer ตอนนี้ถูกเข้ารหัสเป็น UTF-8 ในแพ็กเกจ XMP (XMP Specification ต้องใช้ UTF-8) ทำให้ metadata หลายภาษาคงสภาพครบถ้วนเมื่อวนกลับผ่าน SaveAsPdfA
- อัปเดตสตริง TPdf.AboutInfo ให้รายงานเวอร์ชันผลิตภัณฑ์ปัจจุบัน
Version 1.29.0
- รีเฟรช DLL ของ PDFium ที่บันเดิลมา (Win32 และ Win64 ทั้งบิลด์มาตรฐานและ V8) ไปเป็น snapshot ต้นน้ำวันที่ 2026-05-22 ทำให้ได้ทั้งการแก้ crash path ของ FPDFText_SetText / FPDFText_SetCharcodes และการ harden ภายในอื่น ๆ จากโปรเจ็กต์ PDFium
- เปิดเผย save flag ใหม่ของ PDFium ชื่อ FPDF_SUBSET_NEW_FONTS ใน FPdfPageOps.pas ทำให้ผู้เรียก FPDF_SaveAsCopy สามารถร้องขอให้มีการ subset ฟอนต์ที่ฝังอยู่โดยอัตโนมัติสำหรับอ็อบเจ็กต์ข้อความที่เพิ่มใหม่ได้ ส่วนค่าคงที่เดิม FPDF_INCREMENTAL, FPDF_NO_INCREMENTAL และ FPDF_REMOVE_SECURITY ตอนนี้นิยามด้วยรูปแบบ bit-shift ตาม upstream แล้ว
- เพิ่ม enum FPDF_FONT_BACKEND_TYPE (FREETYPE / FONTATIONS) และฟิลด์ m_FontLibraryType ที่สอดคล้องกันบน FPDF_LIBRARY_CONFIG ใน FPdfView.pas ทำให้แอปที่เริ่ม PDFium พร้อม Skia renderer สามารถเลือก font backend ได้ตั้งแต่ตอนเริ่มต้น
- อัปเดต signature ของ TFPDFPage_InsertObject ให้ตรงกับ upstream โดยฟังก์ชัน C ตอนนี้คืนค่า FPDF_BOOL แทน void แต่ผู้เรียก PDFiumPas เดิมยังคอมไพล์ได้เหมือนเดิม
- แก้สตริง TPdf.AboutInfo ให้รายงานเวอร์ชันผลิตภัณฑ์ปัจจุบันได้ถูกต้อง
Version 1.28.0
- ขยายเอกสารภายในหน้าอย่างมากทั่วทั้ง API reference: แต่ละรายการของ property, method, event และ global function ตอนนี้มีคำอธิบาย 3 ย่อหน้า รายการหมายเหตุ ตัวอย่าง Delphi หลายบรรทัด และบล็อกดูเพิ่มเติมที่สมบูรณ์ขึ้น ครอบคลุมหน้าที่ก่อนหน้านี้ยังบางกว่า 200 หน้า
- ปรับจูนเลย์เอาต์ของ help ให้ตรงกับ visual baseline ของ losLab ที่ใช้ในเอกสารอ้างอิง HotXLS โดยทำให้ขนาด h1/h2 ตรงกัน รวมสไตล์ของกริดนำทาง API เข้าไว้ใน StyleSheet ที่ใช้ร่วมกัน และลบ inline CSS overrides รายหน้าใน Navigation.html ออก
- เอกสารตอนนี้มาพร้อม helper script (Docs\Build-Expand-Entries.ps1) ที่สร้างส่วนขยายของหน้า entry ใหม่จาก data table เดียวได้ เพื่อให้ดูแลรักษาซ้ำได้สม่ำเสมอ
Version 1.27.0
- เพิ่มการสร้าง PDF/A-1b: TPdf.SaveAsPdfA จะบันทึกเอกสารที่เปิดอยู่ให้เป็นไฟล์ที่สอดคล้องกับ PDF/A-1b โดย post-process PDF พื้นฐานด้วย incremental update ซึ่ง inject สตรีม XMP metadata, sRGB ICC OutputIntent และ document catalog ที่อัปเดตแล้ว โดยไม่ต้องใช้ DLL API เพิ่ม
- เพิ่ม TPdf.SaveAsPdfAToStream สำหรับเอาต์พุต PDF/A ในหน่วยความจำ
- เพิ่ม TPdf.ValidatePdfA เพื่อตรวจความสอดคล้องของ PDF/A ใน PDF ที่เปิดอยู่ แล้วคืนผลแบบมีโครงสร้างพร้อมระดับ conformance ที่ตรวจพบและชุด issue ที่พบ
- เพิ่มคุณสมบัติ TPdf.PdfAConformance ที่คืนระดับ conformance ของเอกสารที่เปิดอยู่ในขณะนั้นโดยไม่ต้องเรียก ValidatePdfA โดยตรง
- ส่งออกชนิดใหม่ ได้แก่ TPdfAConformance, TPdfAValidationResult, TPdfAValidationIssue และ TPdfASaveOptions ในยูนิตใหม่ FPdfPdfa.pas
- SaveAsPdfA รองรับ ICC profile แบบกำหนดเองผ่าน TPdfASaveOptions.IccProfileData; หากปล่อยว่าง ระบบจะใช้โปรไฟล์ sRGB IEC61966-2.1 ในตัวให้อัตโนมัติ
- แทนที่เอกสารอ้างอิง HTML แบบก้อนเดียวด้วยระบบ web help ที่จัดโครงสร้างใหม่ โดยมีหน้า API entry แยก 302 หน้า ครอบคลุมทั้ง TPdf และ TPdfView
- เพิ่ม Navigation.html ซึ่งเป็นดัชนีนำทาง API แบบหน้าเดียวที่ครบถ้วน จัดเป็นหกส่วนพร้อมกริด flex 5 คอลัมน์เพื่อการไล่อ่านอย่างรวดเร็ว
- สร้าง TPdf.html และ TPdfView.html ใหม่ให้เป็นหน้าภาพรวมคอมโพเนนต์แบบกะทัดรัด โดยยังคงส่วนอ้างอิงชนิดข้อมูลและลิงก์ออกไปยังหน้า entry แยกของสมาชิกทั้งหมด
- เพิ่มการค้นหาแบบ full-text ที่ขับเคลื่อนด้วย Search.js พร้อมการจับคู่ incremental ฝั่ง client ครอบคลุมหน้าที่ถูกทำดัชนีทั้งหมด 312 หน้า
- อัปเดตแถบนำทางทุกจุดของทั้งไซต์ให้ชี้ไปที่ Navigation.html
Version 1.26.0
- เพิ่ม Demo/Lazarus/BatchExport ซึ่งเป็นพอร์ต LCL ของเดโม Delphi BatchExport จาก v1.14.0 โดยมีความสามารถเหมือนกันสำหรับการส่งออก PDF หลายไฟล์เป็น JPG พร้อมความคืบหน้ารายไฟล์ ความคืบหน้ารายหน้า อินพุต DPI / quality / password และงานแบตช์ที่ยกเลิกร่วมกันได้ผ่าน IPdfCancellationToken
Version 1.25.0
- เพิ่มการนำหน้า Form XObject กลับมาใช้ซ้ำใน TPdf ทำให้สร้าง workflow แบบลายน้ำ template overlay และ “stamp one page onto many” ได้ โดย CreateXObjectFromPage จะสร้าง handle ที่นำกลับมาใช้ซ้ำได้จากหน้าใดก็ได้ของอีกเอกสารหนึ่ง และ InsertFormObjectFromXObject จะใส่สำเนาของหน้าที่ห่อไว้ลงในหน้าปัจจุบัน
- คลาส Pascal ใหม่ TPdfXObject จะห่อ handle FPDF_XOBJECT ของ PDFium และปิดมันให้อัตโนมัติใน destructor ทำให้ไม่ต้องจัดการขั้นตอน FPDF_CloseXObject แบบแมนนวลอีกต่อไป
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 147 เคสต่อชุด และของ C++Builder เป็น 123 เคส ครอบคลุมสัญญาของการสร้าง handle และการแทรก page object
Version 1.24.0
- เพิ่ม TPdf.RenderPageProgressive ซึ่งเป็นตัวแปรของ RenderPage ที่ยกเลิกได้ โดยขับลูป progressive rendering ของ PDFium และ poll IPdfCancellationToken ระหว่างแต่ละรอบ ทำให้งานเรนเดอร์ความละเอียดสูงที่ใช้เวลานานสามารถหยุดกลางหน้าได้
- คืนค่าเป็น TPdfProgressiveStatus: prsDone, prsCancelled หรือ prsFailed และหากส่ง AToken = nil ระบบจะเรนเดอร์จนเสร็จโดยไม่มีทางได้ prsCancelled
- ใช้ zero-copy fast path แบบเดียวกับที่เพิ่มใน v1.21.0 โดย PDFium จะเรนเดอร์ลงใน DIB ของ TBitmap ปลายทางโดยตรง และยังคงมี legacy fallback เดิมเมื่อ DIB ไม่สามารถถูกห่อใช้งานได้
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 145 เคสต่อชุด และของ C++Builder เป็น 121 เคส ครอบคลุมกรณี nil-token, token ที่ถูกยกเลิกล่วงหน้า และความเทียบเท่าระดับพิกเซลกับ RenderPage แบบ synchronous
Version 1.23.0
- เพิ่มเมธอดใหม่ 6 รายการใน TPdfView ที่เปิดความสามารถการเลือกข้อความใน form-widget และ Undo/Redo ของ PDFium ให้แอปใช้งานได้ โดย GetSelectedFormText, SelectAllFormText, FormUndo, FormRedo, FormCanUndo และ FormCanRedo จะ short-circuit อย่างปลอดภัยเมื่อ view ไม่ active หรือเอกสารไม่มี AcroForm widget ที่กำลังโฟกัส
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 142 เคสต่อชุด และของ C++Builder เป็น 119 เคส ครอบคลุมสัญญา no-form-no-focus สำหรับทุกเมธอดใหม่
Version 1.22.0
- เพิ่ม wrapper สำหรับการประกอบหน้าให้ TPdf: ImportPagesByIndex รับอาร์เรย์ดัชนีแบบ zero-based เพื่อคัดลอกหน้าที่ต้องการจากเอกสารต้นทาง, ImportNPagesToOne คืน TPdf ตัวใหม่ที่หน้าต่าง ๆ เป็นคอมโพสิตแบบ N-up ของเอกสารนี้ และ MovePages ใช้จัดเรียงหน้าภายในใหม่
- ImportPagesByIndex รับอาร์เรย์ว่างเพื่อ import ทุกหน้าจากเอกสารต้นทางได้ ซึ่งเทียบเท่ากับการส่ง nil ในระดับ C ABI
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 136 เคสต่อชุด และของ C++Builder เป็น 115 เคส ครอบคลุม subset import, whole-document import, page reorder และ N-up composite
Version 1.21.0
- ปรับปรุงประสิทธิภาพการเรนเดอร์โดยเปลี่ยน TPdf.RenderPage / TPdf.RenderTile และตัวช่วยใน TPdfView ที่สอดคล้องกันให้ใช้เส้นทางเอาต์พุตแบบ zero-copy ทำให้ PDFium เขียนลง DIB buffer ของ TBitmap ปลายทางโดยตรง
- ยังคงเก็บเส้นทาง per-scanline แบบเดิมไว้เป็น safety fallback สำหรับกรณีที่ DIB ปลายทางไม่สามารถถูกห่อใช้งานได้ โดยพฤติกรรมของทั้งสองเส้นทางเหมือนกันทุกไบต์ ต่างกันเพียงความเร็ว
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 132 เคสต่อชุด และของ C++Builder เป็น 112 เคส ครอบคลุมการอัปเกรด caller-bitmap เป็น pf32bit การรับส่งกลับของขนาด และการทดสอบ stride ของ bitmap ขนาดใหญ่
Version 1.20.0
- เพิ่มการไฮไลต์ผลการค้นหาให้ TPdfView: HighlightSearchText(Text, MatchCase, MatchWholeWord) จะสแกนหน้าที่กำลังแสดงอยู่ คืนจำนวนการจับคู่ที่พบ และวาด mask สี HighlightColor ทับทุกจุดที่จับคู่ในการ redraw แต่ละครั้ง ส่วน ClearHighlight ใช้ลบไฮไลต์ และเมื่อเปลี่ยนหน้า ระบบจะล้างให้อัตโนมัติเพราะการจับคู่เป็นแบบเฉพาะหน้า
- HighlightColor มีค่าเริ่มต้นเป็น clYellow และถูกเผยแพร่ไว้เพื่อให้แอปสามารถปรับธีมสีไฮไลต์ให้เข้ากับพาเล็ต UI ของตนได้
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 129 เคสต่อชุด และของ C++Builder เป็น 109 เคส ครอบคลุมสีเริ่มต้น การรับส่งกลับของสี การจับคู่คำจริงใน sample.pdf และสัญญาว่าคำที่ไม่พบต้องคืนค่าเป็นศูนย์
Version 1.19.0
- เพิ่มคุณสมบัติ FitMode ให้ TPdfView พร้อมค่า 4 แบบคือ pfmNone, pfmActualSize, pfmFitPage และ pfmFitWidth โดย fit mode ที่ใช้งานอยู่จะถูกนำกลับมาใช้โดยอัตโนมัติเมื่อ Resize และเมื่อหน้าปัจจุบันเปลี่ยน
- การตั้งค่า Zoom โดยตรงจะยกเลิก fit mode ที่กำลังใช้งานอยู่ (FitMode กลับเป็น pfmNone) เพื่อให้ตรงกับธรรมเนียมของตัวแสดง PDF ทั่วไป
- ค่าเริ่มต้นคือ pfmNone ดังนั้นแอปเดิมจะยังคงพฤติกรรม explicit-zoom ตามเดิม
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 124 เคสต่อชุด และของ C++Builder เป็น 106 เคส ครอบคลุมค่าเริ่มต้น การรับส่งกลับของโหมด fit-page ที่สร้าง zoom จริงบนเอกสารที่โหลดแล้ว และการที่ manual zoom ยกเลิก fit mode
Version 1.18.0
- เพิ่มคุณสมบัติ PageColor ให้ TPdfView เพื่อแยกพื้นหลังของหน้า PDF ที่เรนเดอร์ออกจากค่า Color ของคอนโทรลรอบข้าง โดยค่าเริ่มต้นเป็น clWhite ทำให้หน้า PDF แสดงเป็นสีขาวเหมือนกระดาษไม่ว่าแอป host จะใช้ธีมใด
- พฤติกรรมที่เปลี่ยนไปคือ แอปที่เคยตั้ง TPdfView.Color เพื่อเปลี่ยนสีของหน้า PDF ควรเปลี่ยนมาใช้ PageColor แทน ส่วนประสบการณ์เริ่มต้นดีขึ้นสำหรับกรณีทั่วไปโดยไม่ต้องแก้โค้ด
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 120 เคสต่อชุด และของ C++Builder เป็น 103 เคส ครอบคลุมค่าเริ่มต้นและการรับส่งกลับของสี
Version 1.17.0
- เพิ่ม toggle สำหรับล็อกอินพุตผู้ใช้ใน TPdfView เพื่อให้แอปที่ฝังตัวแสดงไว้ใน kiosk, preview pane หรือบริบทแบบอ่านอย่างเดียว สามารถปิด gesture การนำทางได้โดยไม่ต้อง subclass โดย AllowUserPageChange ใช้ควบคุมคีย์ลัดใหม่, ChangePageOnMouseScrolling ควบคุมการกระโดดหน้าด้วย wheel และ AllowUserTextSelection ถูกสงวนไว้สำหรับเส้นทางการเลือกข้อความด้วยการลากเมาส์ในอนาคต
- การนำทางหน้าด้วยเมาส์ wheel จะข้ามกรณี Ctrl+wheel เพื่อให้แอปยังคงสงวน Ctrl+wheel ไว้ใช้กับการซูมได้
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 118 เคสต่อชุด และของ C++Builder เป็น 101 เคส ครอบคลุมค่าเริ่มต้นและการรับส่งกลับของ toggle
Version 1.16.2
- ขยาย regression coverage ของ TPdfView สำหรับการคลิกลิงก์ annotation เมื่อหน้าที่ตัวแสดงแสดงอยู่ต่างจากหน้าของ TPdf ที่เชื่อมกัน โดยใช้เส้นทางคลิกเมาส์แบบ headless จริงใน Delphi, Lazarus และ C++Builder
- suite ของ Delphi และ Lazarus ตอนนี้รัน 114 เคสต่อชุด และ C++Builder ตอนนี้รัน 99 เคส
Version 1.16.1
- แก้การจัดการคลิกลิงก์ของ TPdfView เพื่อให้ action อัตโนมัติของ annotation และ web link ใช้หน้าที่ตัวแสดงกำลังแสดงอยู่จริง แม้ TPdf ที่เชื่อมกันจะจอดอยู่คนละหน้าก็ตาม
- เพิ่มความแข็งแรงให้ TPdfThumbnailView ต่อ dangling reference ของ Pdf เมื่อ TPdf ที่เชื่อมอยู่ถูกทำลาย
- เพิ่ม regression coverage สำหรับอายุการใช้งานของ thumbnail reference โดย suite ของ Delphi และ Lazarus ตอนนี้รัน 113 เคสต่อชุด และ C++Builder ตอนนี้รัน 98 เคส
- ซิงก์ README, เอกสารการทดสอบ, เนื้อหาค้นหา/ดัชนีของ HTML Help และเอาต์พุตแพ็กเกจ C++ ที่สร้างขึ้น ให้สอดคล้องกับการอัปเดต integration ตั้งแต่ v1.7.0 ถึง v1.16.0
Version 1.16.0
- เพิ่มเดโม Delphi PrintDialog ใหม่ (Demo/Delphi/PrintDialog) ที่โฟกัสการพิมพ์แบบ N-up (1 / 2 / 4 / 9 หน้าต่อแผ่น) พร้อมการกรองหน้าคี่ / คู่ การเรนเดอร์แบบ grayscale และเส้นขอบ cell ขนาด 1 พิกเซลแบบเลือกได้ โดยตั้งใจให้เป็นตัวอย่างคู่ขนาดเล็กของเดโม PrintPDF ที่มีอยู่เดิม
Version 1.15.0
- เพิ่มคอมโพเนนต์ใหม่ TPdfThumbnailView (ยูนิต FPdfThumbnail) ที่เรนเดอร์ thumbnail หนึ่งหน้าต่อหนึ่งแถวในแผงด้านข้างที่เลื่อนได้ พร้อมไฮไลต์เมื่อ hover และเมื่อเลือก รวมถึงการนำทางแบบคลิกเพื่อไปยังหน้า เหมาะสำหรับวางข้าง TPdfView เพื่อให้ผู้ใช้ปลายทางไล่ดูเอกสารยาว ๆ ตามหน้าได้
- คอมโพเนนต์นี้ถูกลงทะเบียนไว้บนแท็บ palette ของ losLab ควบคู่กับ TPdf และ TPdfView โดยมีคุณสมบัติหลัก ได้แก่ Pdf, CurrentPageIndex, ThumbnailWidth, ThumbnailHeight, TextColor, HoverColor, SelectionColor, BorderColor และอีเวนต์ OnPageClick
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 112 เคสต่อชุด และของ C++Builder เป็น 97 เคส ครอบคลุมค่าเริ่มต้น การรับส่งกลับของขนาด thumbnail การ clamp ค่าสุดขั้ว การรับส่งกลับของสี และการกำหนด event handler
Version 1.14.0
- เพิ่มเดโม Delphi BatchExport ใหม่ (Demo/Delphi/BatchExport) เพื่อสาธิตการแปลงไฟล์ PDF จำนวนมากเป็น JPG ในรอบเดียว โดยใช้ TPdf.LoadCustomDocument สำหรับการโหลดแบบสตรีม, IPdfCancellationToken สำหรับการยกเลิกร่วมกัน และแถบความคืบหน้ารวมรายไฟล์พร้อมความคืบหน้ารายหน้า เดโมนี้ใช้ TPdf หนึ่งอินสแตนซ์ต่อหนึ่งไฟล์และจะเปิดโฟลเดอร์ผลลัพธ์ใน Explorer เมื่อการดึงข้อมูลเสร็จสมบูรณ์
Version 1.13.0
- เพิ่ม UI overlay สำหรับ async rendering ให้ TPdfView ผ่านคุณสมบัติใหม่ 3 รายการคือ AsyncRendering, LoadingText และ LoadingColor เมื่อ AsyncRendering เป็น True เส้นทางการวาดแบบหน้าเดียวจะวาดตัวบ่งชี้ “Loading...” ขนาดเล็กทับบนหน้าที่เรนเดอร์ เพื่อให้แอปที่ใช้ worker ของตัวเองกับงานเรนเดอร์ยาว ๆ มีภาษาภาพที่สอดคล้องกัน
- ค่าเริ่มต้นยังคงพฤติกรรมเดิมไว้ โดย AsyncRendering เป็น False ดังนั้นแอปที่ไม่ได้เปิดใช้จะไม่เห็นการเปลี่ยนแปลงทางภาพ
- เอกสารอธิบายชัดขึ้นว่า PDFium เองไม่ใช่ thread safe ดังนั้นการ offload งานเรนเดอร์ไปยัง worker จริง ๆ ต้องให้ผู้เรียกเก็บ TPdf แยกหนึ่งตัวต่อหนึ่ง worker และเดโม batch-export ที่กำลังจะมาจะสาธิตรูปแบบนั้น
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 106 เคสต่อชุด และของ C++Builder เป็น 93 เคส ครอบคลุมค่าเริ่มต้นและการรับส่งกลับของคุณสมบัติทั้งสาม
Version 1.12.0
- เพิ่มการจัดการลิงก์แบบขับด้วยการคลิกให้ TPdfView โดยคุณสมบัติใหม่ LinkOptions ใช้ควบคุมพฤติกรรมอัตโนมัติของ action ลิงก์ PDF 4 ประเภท ได้แก่ goto, URI, launch และ embedded GotoR ซึ่งค่าเริ่มต้นจะเปิด loAutoGoto และ loAutoOpenURI แต่คงปิด loAutoLaunch กับ loAutoEmbeddedGoto ไว้เพื่อไม่ให้การคลิกพลาดไปรันโปรแกรมตามอำเภอใจ
- เพิ่มอีเวนต์ OnAnnotationLinkClick และ OnWebLinkClick ที่จะทำงานก่อน action อัตโนมัติใด ๆ เพื่อให้แอปสามารถตรวจลิงก์ ทำเครื่องหมาย Handled หรือเปลี่ยนเส้นทางเองได้
- การตรวจจับการคลิกลิงก์จะทำงานเฉพาะเมื่อ gesture เป็นการคลิกจริง ไม่ใช่การลาก โดยใช้จุดยึด MouseDown ใหม่ ทำให้ gesture การแพนยังคงไหลผ่านเส้นทาง scroll เดิมโดยไม่เปลี่ยนพฤติกรรม
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 102 เคสต่อชุด และของ C++Builder เป็น 91 เคส ครอบคลุมค่าเริ่มต้นของ LinkOptions การรับส่งกลับหลังตั้งค่า และการกำหนด event handler
Version 1.11.0
- เพิ่มความประณีตด้านภาพให้ TPdfView ด้วยคุณสมบัติ PageShadowSize, PageShadowColor และ PageBorderColor ซึ่งใช้วาดเงาแบบ drop shadow ใต้กรอบหน้าและเส้นขอบ 1 พิกเซลรอบหน้า โดยค่าเริ่มต้นยังคงลุคแบนเดิมไว้
- เพิ่มคุณสมบัติ SmoothScroll เป็นแฟลกแบบ opt-in สำหรับแอนิเมชันการเลื่อนแบบ incremental ในอนาคต โดยวันนี้ยังใช้เพื่อการรับส่งกลับค่าและให้แอปเก็บค่าความชอบไว้ได้ ขณะที่ฝั่งเรนเดอร์ยังคงใช้พฤติกรรมเลื่อนทันทีแบบเดิม
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 98 เคสต่อชุด และของ C++Builder เป็น 89 เคส ครอบคลุมค่าเริ่มต้น การรับส่งกลับของคุณสมบัติ และการ clamp ค่า shadow ขนาดติดลบ
Version 1.10.0
- เพิ่มการแทรกรูปภาพโดยตรงผ่าน overload ใหม่ของ TPdf.AddImage และ TPdfView.AddImage ที่รับได้ทั้ง file path และ TBitmap นอกเหนือจาก AddPicture ที่อิง TPicture เดิม โดย AddImage(FileName) จะรู้จักฟอร์แมตใดก็ตามที่ VCL หรือ LCL graphics units ลงทะเบียนไว้ และไหลผ่าน pipeline เดียวกับ AddPicture
- AddImage(TBitmap) จะข้ามตัวกลาง TPicture ทำให้ผู้เรียกที่มี TBitmap อยู่แล้วจากงานเรนเดอร์หรือการสร้างแบบแบตช์ใช้งานได้ง่ายขึ้น
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 92 เคสต่อชุด และของ C++Builder เป็น 84 เคส ครอบคลุมการแทรก bitmap ขอบเขตของ page object การปฏิเสธ bitmap ที่เป็น nil และการโหลดไฟล์ BMP
Version 1.9.0
- เพิ่มการรองรับ transformation matrix ระดับสูงผ่านคลาสใหม่ TPdfMatrix ในยูนิต FPdfMatrix โดย TPdfMatrix จะห่อ FS_MATRIX ของ PDFium ด้วย OO API สำหรับ Translate, Scale, Rotate, HorizontalFlip, VerticalFlip, CentralFlip, Skew และ Multiply เหมาะสำหรับประกอบทรานส์ฟอร์มก่อนส่งต่อให้ FPDFPageObj_SetMatrix และ PDFium API ที่คล้ายกัน
- TPdfMatrix.Multiply จะ snapshot ค่าทั้งหกของ matrix ให้ถูกต้องก่อนคำนวณค่าแถวใหม่ ช่วยแก้ปัญหาแฝงที่ implementation Pascal ทางเลือกเคยเขียนทับค่าเดิมภายในการเรียกเดียวกันแล้วให้ผลผิดเมื่อมีการประกอบทรานส์ฟอร์มที่ซับซ้อนกว่าการเลื่อนอย่างเดียว
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 88 เคสต่อชุด และของ C++Builder เป็น 81 เคส ครอบคลุม identity, reset, translate / scale / flip ลำดับการประกอบแบบ post-multiplicative และเคส regression ของ Multiply
Version 1.8.0
- เพิ่มการโหลดสตรีมแบบ on-demand ผ่านเมธอดใหม่ TPdf.LoadCustomDocument(AStream, AOwnsStream) และคลาสช่วย TPdfStreamAdapter ที่ขับด้วย FPDF_LoadCustomDocument ของ PDFium ทำให้ PDFium อ่านบล็อกจาก TStream ที่ส่งมาเฉพาะเมื่อจำเป็น และไม่ต้องคัดลอก PDF ขนาดใหญ่มาไว้ในหน่วยความจำล่วงหน้าอีกต่อไป
- เพิ่มการเป็นเจ้าของสตรีมแบบเลือกได้ โดยเมื่อส่ง AOwnsStream = True จะโอนอายุของ TStream ให้ TPdf และ TPdf จะ free มันเมื่อ UnloadDocument ทำงาน
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 79 เคสต่อชุด และของ C++Builder เป็น 75 เคส ครอบคลุมการโหลดแบบสตรีมผ่าน TFileStream การ cleanup ของ owned stream และสัญญาว่าสตรีมที่ภายนอกเป็นเจ้าของจะยังอยู่หลัง unload
Version 1.7.0
- เพิ่ม primitive สำหรับ cooperative async cancellation ในยูนิตใหม่ FPdfAsync โดยเปิดใช้ IPdfCancellationToken / IPdfCancellationTokenSource และ singleton ที่นำกลับมาใช้ซ้ำได้ชื่อ PdfNoCancellationToken เพื่อให้ workflow การเรนเดอร์และการส่งออกที่ใช้เวลานานรองรับการยกเลิกจาก UI ได้อย่างสะอาด
- เพิ่มตัวช่วยน้ำหนักเบา TPdfFuture<T> ที่รัน worker บน background thread และโพสต์ซองผลลัพธ์ TPdfFutureResult<T> กลับสู่ main thread โดยแยกกรณีสำเร็จ ยกเลิก และล้มเหลวออกจากกัน
- ขยาย regression suite ของ Delphi และ Lazarus เป็น 76 เคสต่อชุด และของ C++Builder เป็น 73 เคส ครอบคลุมสถานะการยกเลิก การ cancel แบบ idempotent การกระจาย callback และการลงทะเบียนหลัง cancel
Version 1.6.10
- เพิ่มการเข้าถึง TPdf.PrintPageRanges ระดับสูงสำหรับช่วงหน้าพิมพ์ใน PDF viewer preference โดยคืนค่าช่วงหน้าแบบ one-based ให้โค้ดแอปพลิเคชันใช้งานได้ตรง ๆ
- เพิ่ม TPdf.SetFormFieldFlags / SetFormFieldFlagsAt และตัวช่วยใน TPdfView ที่สอดคล้องกัน เพื่อให้แอปสามารถอัปเดต flag ของฟิลด์ AcroForm ผ่าน public API ได้ รวมถึงกรณี password และ multi-select
- เพิ่มความแข็งแรงให้ ABI coverage ของ binding PDFium สำหรับ FPDF_DWORD ที่ขนาดตาม Windows, callbacks ของ FPDF_FILEACCESS และฟิลด์ V8 embedder slot
Version 1.6.9
- เพิ่ม low-level binding สำหรับการเรนเดอร์ด้วย Skia ของ API ที่เพิ่งถูก export ใหม่คือ FPDF_RenderPageSkia และ FPDF_FFLDrawSkia ใน DLL ของ PDFium แบบมาตรฐานและแบบ V8 ที่บันเดิลมา
- ขยายการตรวจ public binding coverage ทำให้การโหลด DLL แบบมาตรฐานและแบบ V8 ตอนนี้ตรวจจุดเข้า Skia render ควบคู่กับการ probe ความสามารถ V8/XFA ที่มีอยู่เดิม
Version 1.6.8
- เพิ่ม TPdf.SetTextPositions และ TPdfSingleArray เพื่อกำหนดตำแหน่งรายอักขระบน text object ที่มีอยู่ ผ่าน API ใหม่ที่ถูก export คือ FPDFText_SetPositions
- ยกระดับ FPDFText_SetPositions ให้เป็น binding ที่จำเป็นสำหรับ DLL ของ PDFium ที่บันเดิลอยู่ในปัจจุบัน พร้อมยืนยันว่าจุดเข้า Skia render ยังใช้งานไม่ได้เพราะ DLL ยังไม่ export มา
- ขยาย regression suite ของ Delphi, C++Builder และ Lazarus เป็น 65 เคสต่อชุด พร้อม coverage ด้าน text-position
Version 1.6.7
- เพิ่มการเข้าถึง action ใน JavaScript name-tree ของเอกสารในระดับสูงผ่าน TPdf โดยคืนชื่อ action และสคริปต์ผ่าน JavaScriptAction และ JavaScriptActions
- เพิ่ม TPdf.FileIdentifier เพื่ออ่าน permanent ID และ changing ID ใน trailer เป็น TBytes แบบไบนารีโดยไม่มีไบต์ terminator ของ PDFium
- เพิ่ม TPdf.PageBox, GetPageBox และ SetPageBox สำหรับ MediaBox, CropBox, BleedBox, TrimBox และ ArtBox ของหน้าปัจจุบัน
- ยืนยันว่า DLL ของ PDFium ที่บันเดิลอยู่ตอนนี้ยังเหลือจุดเดียวที่ใช้งานไม่ได้ตอนรันคือจุดเข้า Skia render เพราะไม่มี export เหล่านั้นอยู่จริง
- ขยาย regression suite ของ Delphi, C++Builder และ Lazarus เป็น 64 เคสต่อชุด พร้อม coverage ด้าน document JavaScript, trailer ID และ page-box
Version 1.6.6
- เพิ่มการรองรับตอนรันสำหรับ DLL ของ PDFium ที่เปิด V8 ไว้ โดยเมื่อกำหนด EnableV8Engine ก่อนโหลด ระบบจะเลือก pdfium.v8.dll จากต้นไม้ DLLs\Win32 หรือ DLLs\Win64 และเปิดใช้ binding เฉพาะ V8/XFA เมื่อ DLL ที่โหลดมารองรับ
- เพิ่ม V8FeaturesAvailable, XfaBStrHelpersAvailable, GetRecommendedV8Flags และ low-level optional bindings สำหรับ FPDF_BStr_*, FPDF_GetRecommendedV8Flags และ FPDF_GetArrayBufferAllocatorSharedInstance
- ทำให้ FPDFText_SetPositions เป็น optional เพื่อให้ PDFiumPas ยังโหลดร่วมกับ DLL ของ PDFium ที่ไม่ export ตัวตั้งตำแหน่งข้อความเชิงทดลองนี้ได้
- ขยาย regression suite ของ Delphi, C++Builder และ Lazarus เป็น 61 เคสต่อชุด พร้อม coverage ด้านความสามารถของ DLL มาตรฐานและ DLL แบบ V8
Version 1.6.5
- เพิ่มการตรวจ structure-tree ของ tagged PDF ผ่าน TPdf.StructureElements และ TPdfView.StructureElements ครอบคลุมชนิดของ element, title, alternate text, actual text, expansion text, language, marked-content IDs, จำนวนลูก และจำนวน attribute
- เพิ่มการเลือกโหมดพิมพ์ของ Windows PDFium ผ่าน TPdfPrintMode และ SetPdfPrintMode ครอบคลุม EMF, text-only, PostScript, pass-through, image-mask และ Type 42
- เพิ่ม low-level binding สำหรับ public export ของ PDFium แบบ DLL มาตรฐานที่เหลืออยู่ ครอบคลุม JavaScript actions, annotation form flags/font color, สถานะ active ของ page object, indexed insertion, ค่า float ของ content mark, ข้อมูล ICC profile ของรูปภาพ, การลบ form object และ text positions
- ขยาย regression suite ของ Delphi, C++Builder และ Lazarus เป็น 59 เคสต่อชุด พร้อม coverage ด้าน tagged PDF structure-tree, print mode และ public export binding
Version 1.6.4
- อัปเดตเดโมของ Delphi, C++Builder และ Lazarus ให้เปิด PDF ที่สร้างขึ้น ข้อความ/รูปภาพที่ส่งออก และโฟลเดอร์ผลลัพธ์ของงานแบตช์โดยอัตโนมัติหลังสร้างสำเร็จ
Version 1.6.3
- ขยาย regression suite ที่จัดแนวกันของ Delphi, C++Builder และ Lazarus เป็น 56 เคสต่อชุด พร้อม coverage ของ GUI ฝั่ง TPdfView สำหรับตัวช่วย fit-zoom การรับส่งกลับของพิกัด device/page การ hit-test อักขระ และการแพนด้วยเมาส์ผ่านคอนโทรลตัวแสดงในหน้าต่างที่ซ่อนอยู่
- fixture ของ TPdfView ตอนนี้ใช้ขนาดตัวแสดงที่กำหนดชัดเจนและ subclasses ที่มีไว้เพื่อการทดสอบเท่านั้นเพื่อ exercise protected mouse handlers โดยที่ suite ทั้งหมดยังคงเป็น headless
Version 1.6.2
- แก้ TPdf.AddPage(0, ...) ให้หน้าที่แทรกเป็นหน้าแรกกลายเป็นหน้าที่ active ทันที โดยโค้ดตัวอย่างเดิมยังทำงานต่อได้ และ PageNumber ตอนนี้จะรายงานหน้าแบบ one-based ที่ถูกต้องหลังการแทรก
- ซิงก์เวอร์ชันของแพ็กเกจ Lazarus และขยาย regression suite ที่จัดแนวกันของ Delphi, C++Builder และ Lazarus เป็น 52 เคสต่อชุด
Version 1.6.1
- แก้ข้อกำหนดเวอร์ชันต่ำสุดที่ผิดในตัวตรวจความสอดคล้องเวอร์ชัน PDF ของ v1.6.0 โดยจัดประเภท action SetState ใหม่จาก PDF 1.5 ลงมาเป็น PDF 1.2 ให้ตรงกับ PDF 1.2 Reference 6.9.9 ทำให้เป้าหมาย SaveAs แบบ PDF 1.3 / 1.4 ที่มี SetState บันทึกได้ถูกต้องแทนที่จะถูกปฏิเสธ
- เพิ่มการตรวจ lexical ของ PDF 1.2 ตามหัวข้อสเปกเดียวกัน โดย action แบบ Sound, Movie และ NOP รวมถึง color space แบบ Separation จะถูกบล็อกเมื่อเวอร์ชันเป้าหมายเก่ากว่า PDF 1.2
- ขยาย regression suite ของ Delphi, C++Builder และ Lazarus เป็น 50 เคสต่อชุด ด้วยการเพิ่มการทดสอบยอมรับ SetState บน PDF 1.4 เพื่อยึดขอบเขตที่แก้ไขแล้วไว้
Version 1.6.0
- Hardened explicit PDF 1.0 through PDF 1.7 SaveAs targets with a full version-feature validator that covers the entire PDF 1.1 through ISO 32000-1 feature timeline. The validator now blocks saves that contain dictionary entries, filter names, annotation subtypes, action types, fonts, color spaces, or encryption parameters introduced after the chosen target version. ตัวอย่าง: JBIG2Decode (1.4+), MarkInfo / Tagged PDF (1.4+), OutputIntents (1.4+), ICCBased / DeviceN / BleedBox / TrimBox / ArtBox / StructTreeRoot (1.3+), Polygon / PolyLine / Caret / Screen / Watermark / Redact annotations, AES and AES-256 encryption (CFM AESV2 / AESV3), Perms / Legal / Requirements / NeedsRendering catalog entries, and version-gated actions such as JavaScript, Trans, SetState, Rendition, GoToE, GoTo3DView are all rejected when the target PDF version cannot represent them
Version 1.5.13
- ขยาย regression suite ของ Delphi, C++Builder และ Lazarus เป็น 49 เคสต่อชุด พร้อมเพิ่ม coverage โดยตรงสำหรับการปฏิเสธ ICCBased color spaces, Tagged PDF MarkInfo, Polygon annotations, การเข้ารหัส AES (V2) และ Redact annotations เมื่อเป้าหมายเป็น PDF 1.2 / 1.3 / 1.4 / 1.5 / 1.6 ตามลำดับ
Version 1.5.12
- แก้ post-processing ของ SaveAs สำหรับการ rewrite catalog แบบ incremental โดย PDFiumPas ตอนนี้จะตรวจสอบ repeated indirect object ตัวล่าสุด ทำให้ override ของ /Version ใน catalog เดิมถูกแทนที่ได้ถูกต้องเมื่อบันทึกไปยังเวอร์ชัน PDF เป้าหมายที่เก่ากว่าแบบ explicit
- ขยาย regression suite ของ Delphi, C++Builder และ Lazarus เป็น 44 เคสต่อชุด พร้อมเพิ่ม coverage โดยตรงสำหรับการแทนที่ /Version ใน catalog ที่ค้าง การ normalize เวอร์ชัน catalog ของ PDF 1.4 และการปฏิเสธฟีเจอร์ transparency กับ portable collection เมื่อเวอร์ชัน PDF เป้าหมายที่เลือกไม่สามารถแทนได้
Version 1.5.11
- เพิ่มความแข็งแรงให้งานเอาต์พุต SaveAs แบบมีเวอร์ชันสำหรับเป้าหมาย PDF 1.3, 1.4, 1.5, 1.6 และ 1.7 โดย PDFiumPas ตอนนี้จะ normalize marker เวอร์ชันใน catalog, คง OpenAction แบบ Fit Height เริ่มต้นให้ปลอดภัยตามเวอร์ชัน และปฏิเสธฟีเจอร์ PDF ที่ใหม่กว่าเมื่อเวอร์ชันเป้าหมายที่เลือกไม่รองรับ
- เพิ่ม regression coverage ของ Delphi, C++Builder และ Lazarus ที่บันทึกและโหลดไฟล์ PDF 1.3 ถึง PDF 1.7 แบบ explicit กลับมาใหม่ เพื่อตรวจ header สุดท้าย OpenAction แบบ Fit Height เริ่มต้น และเวอร์ชัน PDF ที่รายงานออกมา
Version 1.5.10
- ขยับจาก option B ในสเปกไปสู่ option C ด้วยการเพิ่ม smoke test ของ TPdfView ใน suite ของทั้งสาม IDE โดยแต่ละ suite จะสร้าง TForm แม่ที่ถูกซ่อนไว้ (ฝั่ง C++Builder ใช้
new TForm(NULL, 0)) นำ TPdfView ไป reparent ตั้ง Active := True แล้วตรวจ surface การรับส่งกลับของ PageCount, ค่าเริ่มต้นของ PageNumber, Zoom, Rotation, DisplayMode และว่า View.Text ตรงกับ TPdf.Text ใต้ชั้นจริง
Version 1.5.9
- ขยับจาก option A ในสเปกไปสู่ option B ด้วยการเพิ่ม render smoke test ใน suite ของทั้งสาม IDE โดยแต่ละ Tests.Render จะเรียก TPdf.RenderPage บน sample.pdf และตรวจสัญญาณที่ทนทาน 3 อย่างแทน checksum แบบ byte-for-byte ได้แก่ bitmap ที่คืนมาตรงกับขนาดพิกเซลที่ขอ ขนาดที่ต่างกันให้ bitmap ที่สอดคล้องกัน และหน้าที่เรนเดอร์มีพื้นหลังขาวอย่างน้อย 95% พร้อมพิกเซลที่ไม่ขาวอย่างน้อย 50 จุด (Lazarus: 20) ที่แสดงข้อความ anti-aliased
Version 1.5.8
- ปิดกลุ่มแผนทดสอบ A(2) เดิมด้วยการเพิ่ม regression อีก 7 รายการต่อ IDE ครอบคลุมการสร้าง anHighlight ด้วย TPdf.CreateAnnotation พร้อมรอบ SaveAs/LoadDocument เส้นทางอ่าน AcroForm บน Demo/Delphi/FormFill/cmp_fill_out_and_merge_forms.pdf และ coverage ของเส้นทางอ่านสำหรับ Bookmarks, LinkAnnotationCount และ WebLinkCount บนเอกสารที่ไม่มีฟีเจอร์เหล่านี้ โดย suite ของแต่ละ IDE ตอนนี้รัน 30 เคส
Version 1.5.7
- ขยาย suite ของ Delphi (DUnitX), Lazarus (FPCUnit) และ C++Builder (GoogleTest) ด้วย regression ใหม่ 7 รายการต่อ IDE ครอบคลุม PdfVersion, PageRotation, การค้นหา substring ด้วย TPdf.FindFirst / FindNext, ความสอดคล้องของ CharacterOrigin / CharacterRectangle กับจุดกำเนิด AddText, การลงทะเบียน CreateAttachment พร้อมรอบ SaveAs/LoadDocument และรอบ AddText ของข้อความที่มี accent ซึ่งยืนยันว่าเส้นทางฝัง European TrueType จาก v1.3.0 ยังรักษา code point ใน Latin-1 supplemental ได้ครบ
Version 1.5.6
- PDF ที่ถูกบันทึกตอนนี้จะได้ OpenAction เริ่มต้นแบบ Fit Height สำหรับหน้าแรกเมื่อยังไม่มี OpenAction อยู่ ทำให้โปรแกรมอ่าน PDF แสดงเอกสารที่สร้างขึ้นด้วยการซูมตามความสูงของหน้าในครั้งแรก
- เพิ่ม regression coverage ของ Delphi, Lazarus และ C++Builder สำหรับ OpenAction ที่สร้างขึ้นและการตั้งค่า Fit Height
Version 1.5.5
- เพิ่ม regression test ใน suite ของ Delphi (DUnitX), Lazarus (FPCUnit) และ C++Builder (GoogleTest) สำหรับพื้นผิว API ของการตรวจอักขระและฟอนต์แบบ indexed โดย suite ของ Lazarus จะข้าม FontData อย่างตั้งใจเพราะภายใต้ FPC ยังเกิด access violation ภายใน FPDFFont_GetFontData
Version 1.5.4
- เพิ่มเดโม Attachment สำหรับ C++Builder ที่พอร์ตมาจากตัวอย่าง Delphi ครอบคลุมการสร้าง PDF การเพิ่ม รายการ การดึง การลบ และการบันทึกไฟล์แนบแบบฝัง พร้อมการแสดง MIME subtype
Version 1.5.3
- เปิดเผยการคำนวณหน้าแบบ spread ที่อยู่เบื้องหลังโหมดสองหน้าของ TPdfView ให้เป็นตัวช่วยระดับยูนิตชื่อ ComputeSpreadPages(DisplayMode, PageNumber, PageCount, out LeftPageNo, out RightPageNo) โดยพฤติกรรมไม่เปลี่ยน เพียงแต่ช่วยให้ทดสอบกฎแบบ cover-aware ได้อย่างอิสระโดยไม่ต้องสร้าง viewer จริง
- เพิ่ม regression test 5 รายการใน suite ของ Delphi (DUnitX), Lazarus (FPCUnit) และ C++Builder (GoogleTest) ครอบคลุมเอกสารว่าง การจับคู่สองหน้าแบบมาตรฐาน หน้าปกที่ยืนเดี่ยวใน dmTwoPageContinuousWithCover คู่หน้าหลังปก และพฤติกรรมการ clamp ของหน้าสุดท้าย / นอกช่วง
Version 1.5.2
- เพิ่มการรองรับภาษาของเอกสารผ่าน TPdf.Language ซึ่งแมปกับรายการ /Lang ใน PDF catalog
- เพิ่มการเข้าถึง MIME subtype ของไฟล์แนบผ่าน TPdf.AttachmentType
- เพิ่ม anRedact ให้ TPdfAnnotationSubtype และเพิ่มตัวช่วยลบ page object สำหรับ TPdf และ TPdfView
- อัปเดตเดโม viewer และ attachment ให้แสดงข้อมูลภาษาและชนิดไฟล์แนบแบบใหม่เมื่อมีให้ใช้งาน
Version 1.5.1
- เพิ่ม dmTwoPageContinuousWithCover ให้ TPdfView เพื่อให้เลย์เอาต์ของตัวแสดงสามารถแสดงหน้าแรกเดี่ยว แล้วจึงต่อด้วย spread แบบสองหน้าได้
- อัปเดตเดโม MultiPageViewer ของ Delphi, C++Builder และ Lazarus ให้เปิดใช้โหมดแสดงสองหน้าแบบรับรู้หน้าปก
Version 1.5.0
- เพิ่ม suite การทดสอบอัตโนมัติระดับ smoke สำหรับ Delphi (DUnitX), Lazarus (FPCUnit) และ C++Builder (GoogleTest) โดยทั้งสาม suite ใช้ fixture PDF เดียวกันใน Tests\TestData และรันเคสเดียวกัน 7 รายการ ครอบคลุมการโหลดเอกสาร ข้อมูลหน้า การดึงข้อความ metadata รอบ save และโหลดกลับ การตรวจ header ของ PDF และคุณสมบัติ Compressed
Version 1.4.3
- Enhanced the Fontคุณสมบัติ demo to show both TPdfView and TPdf font metadata APIs, including font handles, font data size, and character metrics
- เพิ่มเติม indexed TPdfView character and font inspection properties and updated the Fontคุณสมบัติ demo to query text-object font metadata
Version 1.4.2
- เพิ่มคุณสมบัติสำหรับตรวจอักขระและฟอนต์แบบ indexed ให้ TPdf เพื่อการวิเคราะห์ข้อความโดยไม่ต้องมี viewer โดย CharacterAngle, CharacterFontSize และ CharacterFontWeight จะอ่าน metric รายอักขระจาก text stream ของหน้าปัจจุบัน ส่วน FontAscent, FontBaseName, FontData, FontDescent, FontFamilyName, FontHandle, FontIsEmbedded, FontItalicAngle และ FontWeight จะอ่าน metadata ของฟอนต์จาก text object ใดก็ได้ในหน้าปัจจุบัน
- page object ที่ไม่ใช่ข้อความจะคืนค่าเป็นศูนย์หรือค่าว่างอย่างปลอดภัยสำหรับคุณสมบัติ Font* ทั้งหมด แทนที่จะโยนข้อผิดพลาด ทำให้ไล่ตรวจทุก page object แล้วสนใจเฉพาะตัวข้อความได้ง่ายขึ้น
- FontBaseName จะอ่านชื่อฟอนต์ฐานแบบ PostScript โดยตรงแทนการ fallback ไปใช้ชื่อ family ของฟอนต์ ทำให้ได้ตัวระบุของฟอนต์ที่ฝังอยู่แม่นยำขึ้น
Version 1.4.1
- เพิ่มเดโม EuropeanText รุ่น C++Builder และ Lazarus เพื่อให้ตระกูล IDE ที่รองรับทั้งหมดสามารถยืนยันการสร้างข้อความยุโรปที่มี accent ด้วยฟอนต์ TrueType ของระบบได้
- เพิ่มเดโม FormFill รุ่น C++Builder และ Lazarus รวมถึง PDF ฟอร์มตัวอย่าง การแก้ไขฟิลด์ การสร้าง appearance ใหม่ การบันทึกแบบกรอกข้อมูลแล้ว และ workflow การบันทึกแบบ flatten
Version 1.4.0
- เพิ่มการรองรับ Lazarus / Free Pascal โดยแพ็กเกจใหม่ PDFiumLaz จะให้ TPdf, TPdfView และคอมโพเนนต์ที่เกี่ยวข้องชุดเดียวกันภายใต้ LCL widget set ขยายไลบรารีไปยัง Lazarus IDE และคอมไพเลอร์ Free Pascal ควบคู่กับแพ็กเกจ Delphi และ C++Builder ที่มีอยู่เดิม
- เพิ่มเดโมรุ่น Lazarus เพื่อให้นักพัฒนา Lazarus สามารถสำรวจทุกฟีเจอร์ผ่านตัวอย่างที่รันได้จริง
- แก้ปัญหาการคอมไพล์บน Lazarus ที่ conditional defines ของ Free Pascal เคยถูกประเมินร่วมกับการตรวจเวอร์ชันคอมไพเลอร์ Delphi จนทำให้บิลด์ FPC พยายาม resolve ชื่อยูนิตเฉพาะ Delphi แล้วล้มเหลว
Version 1.3.1
- บันทึก workflow การ flatten ฟอร์มไว้ในชุด help แล้ว โดยตอนนี้ GenerateFormAppearances, FlattenPage, FlattenAllPages และค่าคงที่ FLAT_* / FLATTEN_* ที่เกี่ยวข้อง ถูกครอบคลุมทั้งใน TPdf, TPdfView, API reference, feature matrix และตัวอย่างการเขียนโปรแกรม
- แก้ตารางสถาปัตยกรรมในหน้า overview ให้แสดงรายชื่อ binding units ที่ส่งมากับโฟลเดอร์ Lib จริง
Version 1.3.0
- ปรับปรุงการรองรับอักขระยุโรปเมื่อสร้าง PDF โดย TPdf.AddText ตอนนี้จะโหลดและแคชฟอนต์ TrueType ของระบบที่ตรงกันก่อนสร้าง text object ช่วยคงอักขระที่มี accent ของภาษา Czech, French, German, Spanish, Portuguese, Polish และ Turkish ซึ่งฟอนต์มาตรฐานในตัวของ PDFium แทนไม่ได้
- แอปที่ก่อนหน้านี้สร้างเครื่องหมายคำถามหรือ replacement glyph สำหรับข้อความละตินที่ไม่ใช่ ASCII ตอนนี้จะแสดงผลได้ถูกต้องโดยไม่ต้องแก้โค้ด พร้อมเพิ่มเดโม EuropeanText เพื่อสาธิตฟีเจอร์นี้
Version 1.2.0
- เพิ่มการรีเฟรช appearance ของ AcroForm ให้ TPdf โดยเมื่อเรียก GenerateFormAppearances หลังแก้ค่า FormField[] ระบบจะอัปเดต appearance ของ widget ทำให้ค่าที่กรอกมองเห็นได้ในโปรแกรมอ่าน PDF มาตรฐานโดยไม่ต้องอาศัยเซสชันแก้ไขแบบโต้ตอบ
- เพิ่มตัวช่วย flatten ฟอร์มให้ TPdf (FlattenPage / FlattenAllPages) และ TPdfView (FlattenPage สำหรับหน้าที่ตัวแสดงกำลังดูอยู่) โดยการ flatten จะฝังค่า field ที่กรอกแล้วเป็นเนื้อหาหน้าปกติอย่างถาวรและลบชั้นฟอร์มโต้ตอบออกไป ทำให้ได้เอกสารแบบคงที่ที่แสดงผลสม่ำเสมอในทุกตัวอ่าน
- เพิ่ม Demo\Delphi\FormFill เพื่อสาธิต workflow การกรอกแล้วบันทึก และการกรอกแล้ว flatten ด้วย PDF ตัวอย่างแบบ AcroForm
Version 1.1.2
- เพิ่มการบีบอัดสตรีม PDF ตอนบันทึก โดยคุณสมบัติใหม่ TPdf.Compressed (เปิดใช้เป็นค่าเริ่มต้น) จะเขียน content stream ที่ไม่บีบอัดใหม่ให้เป็นสตรีมแบบ FlateDecode เมื่อบันทึก ช่วยลดขนาดไฟล์ของ PDF ที่สร้างด้วยโค้ดได้มาก และหากแอปต้องการเอาต์พุตแบบไม่บีบอัดก็สามารถตั้ง Compressed เป็น False ก่อนเรียก SaveAs ได้
Version 1.1.1
- บิลด์แพ็กเกจ Win64 จะไม่รวมยูนิตลงทะเบียนแบบ design-time อีกต่อไป ช่วยป้องกันความล้มเหลวตอนบิลด์เมื่อแพ็กเกจ Win64 ถูกนำไปใช้ในบริบทแบบ runtime-only
- ตัวโหลด DLL ของ PDFium ตอนนี้จะค้นหาใน subdirectory ของแอปแบบ Win32 หรือ Win64 ก่อน โดยใช้ชื่อมาตรฐาน pdfium.dll และ pdfium.v8.dll แล้วจึง fallback ไปยังโฟลเดอร์แบนของแอปและไดเรกทอรีระบบของ Windows ซึ่งตรงกับโครงร่าง DLL ที่บันเดิลมากับแพ็กเกจคอมโพเนนต์และทำให้การติดตั้งตรงไปตรงมาขึ้น
Version 1.1.0
- แก้ข้อบกพร่องด้านการ clipping ในโหมดสองหน้าของ TPdfView โดยก่อนหน้านี้เนื้อหาหน้าไหลข้ามร่องกลางเพราะ tile ของหน้าซ้ายและขวาใช้ clipping rectangle เดียวกัน ตอนนี้แต่ละ tile จะ clip แยกกันเอง ทำให้เนื้อหายังอยู่ภายในขอบของหน้าตน
- ปรับปรุงข้อความผิดพลาดในเดโม Delphi เมื่อหา PDFium DLL ไม่พบ ให้มีคำแนะนำที่ชัดเจนขึ้นพร้อมชื่อ DLL และตำแหน่งที่คาดหวัง