บทความเทคนิค

แปลง PDF เป็น PDF/A และซ่อมแซมเมตาดาต้าของเอกสาร

ConvertToPDFA เปลี่ยนเอกสารธรรมดาให้เป็นเอกสารเก็บถาวรในการเรียกเพียงครั้งเดียว มันเอาสิ่งที่ part ที่เลือกห้ามออก เพิ่มสิ่งที่ part กำหนด ระบุ part ที่เอกสารอ้าง แล้วตรวจสอบผล การอ้างจะรายงานว่าผ่านก็ต่อเมื่อการตรวจสอบผ่านเท่านั้น และ GetPDFAConversionReport แสดงสิ่งที่ทำไปและสิ่งที่ยังคงขัดขวางอยู่

คุณสมบัติสุดท้ายนี้คือการตัดสินใจด้านการออกแบบที่ควรให้ความสนใจ ตัวแปลงที่ปั๊มการอ้างโดยไม่ตรวจสอบนั้นแย่กว่าไม่มีตัวแปลงเสียอีก เพราะไฟล์ที่บอกว่าตัวเองเป็นเอกสารเก็บถาวรทั้งที่ไม่ใช่จะผ่านเลยไปในระบบที่มิฉะนั้นจะจับมันได้ ความล้มเหลวปรากฏขึ้นหลายปีให้หลัง ในการตรวจสอบบัญชี กับเอกสารที่ไม่มีใครสร้างใหม่ได้

ทำไม PDF ที่ดูถูกต้องจึงตก PDF/A check

บ่อยที่สุดเพราะสองจุดที่ PDF บอกว่าใครเป็นผู้เขียนมันไม่ตรงกัน ตัวตรวจสอบอ่านทั้ง document information dictionary และ XMP packet แล้วปฏิเสธไฟล์ที่ทั้งสองต่างกัน — และไฟล์ส่วนใหญ่ที่ตกจุดนี้แทบไม่เคยมีส่วน XMP ถูกเขียนเลยตั้งแต่แรก

RepairDocumentMetadata นำทั้งสองมาตรงกันแล้วคืนจำนวนรายการที่ซ่อมแซม เมื่อเพียงฝั่งเดียวพกค่า อีกฝั่งจะเติมจากฝั่งนั้น ดังนั้นจึงไม่มีอะไรที่บันทึกไว้แล้วถูกทิ้งไป ไม่มีใครต้องตัดสินใจว่าสำเนาไหนน่าเชื่อถือกว่ากัน เพราะในทางปฏิบัติสำเนาหนึ่งว่างเปล่าเสมอ

มีการซ่อมแซมที่สองในคำสั่งเดียวกันที่จับกรณีที่ซับกว่า เอกสารที่ตั้งเข้าโหมด PDF/A จะได้รับการคืนค่า standards identification หากมันหายไป ซึ่งเกิดขึ้นทุกครั้งที่ผู้เรียกส่ง XMP packet ของตัวเองเข้ามา หากไม่มี identification นั้น ตัวตรวจสอบจะอ่านไฟล์เป็น PDF ธรรมดาแล้วรายงานทุกกฎของ part ที่อ้างว่าไม่ผ่าน — ความล้มเหลวที่ดูตระการตระการด้วยสาเหตุเล็กเพียงจุดเดียว

var
  Lib: TPDFlib;
  Repaired: Integer;
begin
  Lib := TPDFlib.Create;
  try
    Lib.LoadFromFile('incoming.pdf', '');
    Repaired := Lib.RepairDocumentMetadata;
    Log(Format('%d metadata entries brought into agreement', [Repaired]));
    Lib.SaveToFile('incoming-fixed.pdf');
  finally
    Lib.Free;
  end;
end;

การเลือก part ก่อนแปลง

SetPDFAMode และ ConvertToPDFA ใช้เลขลำดับโหมดเดียวกัน และสามค่าเป็นของล่าสุด โหมด 9 คือ PDF/A-4 ซึ่งเป็น part สร้างบน PDF 2.0 โหมด 10 คือ PDF/A-4e ที่เพิ่มอนุญาต 3D และ rich media และโหมด 11 คือ PDF/A-4f ที่อนุญาตไฟล์ฝังรูปแบบใดก็ได้

Part 4 ระบุตัวเองต่างจาก part ก่อนหน้า คือด้วยหมายเลข part และปีที่ part ตีพิมพ์ โดยไม่มี conformance letter สำหรับ PDF/A-4 ธรรมดา และมี letter E หรือ F สำหรับส่วนขยายทั้งสอง การตรวจสอบจำ part 4 ได้ ตัดสินไฟล์ของมันเทียบกับ PDF 2.0 แทน 1.7 และรายงานไฟล์ part 4 ที่ไม่ระบุปี revision ของตัวเอง

ทุกไฟล์ฝังในเอกสาร part 4 ระบุความสัมพันธ์กับเอกสาร เช่นเดียวกับที่ part 3 และ part 4 กำหนดเหมือนกัน นี่คือกฎที่ครั้งหนึ่งเคยจับไฟล์แนบธรรมดา ความสัมพันธ์ถูกเขียนเฉพาะไฟล์แนบตั้งแต่ตัวที่สองเป็นต้นไปและไม่เคยเขียนให้ตัวสุดท้าย ดังนั้นเอกสารที่มีไฟล์แนบเพียงไฟล์เดียว — ซึ่งเป็นกรณีทั่วไป — จึงไม่พกความสัมพันธ์เลยและตก validation พอดีที่จุดนั้น

var
  Verdict: Integer;
begin
  Lib.LoadFromFile('report.pdf', '');
  Verdict := Lib.ConvertToPDFA(9);        // 9 = PDF/A-4, 10 = 4e, 11 = 4f
  Memo1.Lines.Text := Lib.GetPDFAConversionReport;
  if Verdict = 1 then
    Lib.SaveToFile('report-pdfa4.pdf')
  else
    Log('conversion incomplete - see the report for what stands in the way');
end;

รายงานการแปลงมีไว้ทำอะไร

เพื่อตัดสินใจว่าจะทำอะไรต่อไป การแปลงที่สำเร็จไม่ต้องการรายงาน การแปลงที่ไม่สำเร็จต่างหากที่เป็นเหตุผลที่รายงานนี้มีอยู่ อุปสรรคบางอย่างเอาออกได้ด้วยตัวแปลง บางอย่างเอาออกไม่ได้ — การเข้ารหัส เนื้อหาต้องห้ามที่พกความหมาย หรือ font program ที่ไม่มีอยู่ในเครื่องเลย รายงานแยกแยะสิ่งที่ทำไปจากสิ่งที่ยังเหลือ ซึ่งเปลี่ยน "การแปลงล้มเหลว" ให้กลายเป็นรายการงาน

ถือว่าคำตัดสินคือประตูในไปป์ไลน์แบบแบตช์ แปลง อ่านคำตัดสิน แล้วส่งไฟล์ไปยังเส้นทางที่เหมาะสม เก็บถาวรไฟล์ที่ผ่าน ส่งไฟล์ที่เหลือเข้าคิวให้มนุษย์พร้อมแนบรายงาน สิ่งที่คุณไม่ควรทำคือบันทึกเอาต์พุตของการแปลงที่ล้มเหลวเข้าคลังเก็บเพราะมันดูดีกว่าอินพุต — ตอนนี้มันพกการอ้างที่การตรวจสอบปฏิเสธที่จะยืนยัน

การอ่านเครื่องหมายที่ไฟล์พกอยู่แล้ว

ก่อนแปลงอะไร ให้รู้ก่อนว่าเอกสารบอกอะไรเกี่ยวกับตัวเอง การตรวจสอบ PDF/A ที่อ่านเครื่องหมายมาตรฐานที่มีอยู่ไม่ได้จะตัดสินไฟล์ทุกไฟล์เทียบกับ part 1 ไม่ว่าจะอ้าง part ใด ซึ่งหมายความว่าเอกสาร PDF/A-2 หรือ PDF/A-3 ที่ถูกต้องสมบูรณ์ได้รับการรายงานว่าไม่พกเครื่องหมายและเป็นเวอร์ชันสูงเกินไป — ตรงกันข้ามกับความจริง

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

ทำความสะอาดก่อนเก็บถาวร และบั๊กที่ควรรู้ไว้

การแปลงเก็บถาวรและการทำความสะอาดมักทำงานร่วมกัน เพราะเนื้อหาที่นโยบายความปลอดภัยต้องการเอาออกทับซ้อนกับเนื้อหาที่ PDF/A ห้ามอย่างมาก SanitizeDocument เอา JavaScript ออก และการเอาสคริปต์ตัวสุดท้ายออกยังเอา name tree ที่ว่างเปล่าที่มันทิ้งไว้ออกด้วย — name tree ที่มิฉะนั้นจะยังบอกตัวอ่านอยู่ว่าเอกสารพกสคริปต์

ส่วนที่สองนี้เรียนรู้มาแบบเจ็บตัว off-by-one ในรายการแพ็กเกจทำให้การทำความสะอาดรายงานว่าเอาสคริปต์ออกทั้งที่ไม่ได้เอาออกสักตัว เอกสารที่ผ่านการทำความสะอาดจึงยังรันสคริปต์เมื่อเปิด นี่เป็นข้อโต้แย้งที่ดีสำหรับหลักการทั่วไปที่บทความนี้ทั้งหมดยืนอยู่ — ตรวจสอบผลแทนที่จะเชื่อใจการดำเนินการ ทั้งในไปป์ไลน์ของคุณเองเท่าที่ในไลบรารี

สำหรับงานเก็บถาวรโดยรอบ ดูคู่มือ PDF/A และ PDF/UA preflight, redaction จริงและการเอาเนื้อหาออก และ XMP extension schema ของ PDF/A-3 สำหรับ Factur-X ซึ่งครอบคลุมด้านเมตาดาต้าเมื่อเอกสารที่เก็บถาวรยังพกข้อมูลใบแจ้งหนี้ที่มีโครงสร้าง

PDFlibPas เป็นไลบรารี PDF แบบ Pascal พื้นเมืองสำหรับ Delphi, C++Builder และ Lazarus การแปลง การซ่อมแซม และการตรวจสอบจึงเกิดขึ้นภายในโพรเซสของคุณเองโดยไม่มีเครื่องมือภายนอกเข้ามาเกี่ยว — ดู หน้าผลิตภัณฑ์ PDFlibPas สำหรับ part และแพลตฟอร์ม PDF/A ที่รองรับ