PDF-A-Checker

From WikiName
Jump to: navigation, search

สำหรับหัวข้อนี้จะเป็นการแนะนำเกี่ยวกับการเขียนโปรแกรม Python เพื่อทำการวิเคราะห์ว่า ไฟล์ PDF ที่เราระบุนั้นได้มาตรฐานตรงตาม PDF/A หรือไม่

เครื่องมือที่ใช้[edit]

  1. PyCharm (IDE)
  2. Python 3.7
  3. Tkinter สำหรับสร้าง GUI
  4. PDFMiner สำหรับทำงานกับไฟล์ PDF ที่รองรับ Python 3.x

Requirement[edit]

sudo apt-get install python3-distutils
sudo apt-get install python3-tk

"xmp.py" from http://blog.matt-swain.com/post/25650072381/a-lightweight-xmp-parser-for-extracting-pdf

Code[edit]

from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdftypes import resolve1
from xmp import xmp_to_dict
import tkinter
from tkinter import filedialog

top = tkinter.Tk()

def validatePDF():
    fp = open(lbl.cget("text"), 'rb')
    parser = PDFParser(fp)
    doc = PDFDocument()
    parser.set_document(doc)
    doc.set_parser(parser)
    doc.initialize()
    try:
        if 'Metadata' in doc.catalog:
            metadata = resolve1(doc.catalog['Metadata']).get_data()
            xmp_dict = xmp_to_dict(metadata)
            conf = xmp_dict['http://www.aiim.org/pdfa/ns/id/']['conformance']
            prt = xmp_dict['http://www.aiim.org/pdfa/ns/id/']['part']
            lblResult.configure(fg='green')
            lblResult.configure(text='Commpliance: PDF/A-' + prt + conf.lower())
        else:
            lblResult.configure(fg='red')
            lblResult.configure(text='Commpliance: No')
    except:
        lblResult.configure(fg='red')
        lblResult.configure(text='Commpliance: No')


def selFile():
    lblResult.configure(text='')
    file_path = tkinter.filedialog.askopenfilename(filetypes=[("PDF File","*.pdf")])
    lbl.configure(text=file_path)
    validatePDF()

back = tkinter.Frame(master=top, width=350, height=50, bg='white')
back.pack()

var=tkinter.StringVar()
lblTitle = tkinter.Label( top, text='PDF/A Checker', font=('',20),fg='black' )
lbl = tkinter.Label( top, text='file path??' )
lblResult = tkinter.Label( top, text='' )
lblResult.configure(font=('',20))


btnFile = tkinter.Button(top, text ="Select File", command = selFile)

lblTitle.pack()
lblResult.pack()
lbl.pack()
btnFile.pack()

top.mainloop()

PDFMiner[edit]

เนื่องจาก pdfminer [1] ของดั้งเดิมจะรองรับกับ Python 2.x เท่านั้น จึงไม่สามารถนำมาใช้กับ Python 3 ได้โดยตรง แต่ก็มีผู้มาแก้ไขให้สามารถใช้กับ Python 3.x ได้ pdfminer3k [2] โดยสามารถติดตั้งผ่าน pip install ได้ ดังนี้

pip install pdfminer3k

Workflow[edit]

  1. อ่านไฟล์ PDF ที่ต้องการเข้ามาใน Python
  2. อ่านค่า Metadata (xmp) ของไฟล์ PDF ่เข้ามาด้วย PDFMiner
  3. ถ้าไม่มีค่า Metadata ให้ถือว่าไฟล์ PDF นั้นไม่ Compliance กับ PDF/A
  4. ถ้ามีค่า Metadata ให้อ่านค่า attribute ที่ชื่อ conformance กับ part เพื่อนำมาแสดงผลว่าตรงกับมาตรฐานใด

หน้าจอ[edit]

ตัวอย่างไฟล์ PDF ตามมาตรฐานต่างๆ[edit]

  1. PDF/A-1a
  2. PDF/A-1b
  3. PDF/A-2a
  4. PDF/A-2b
  5. PDF/A-2u
  6. PDF/A-3a
  7. PDF/A-3b
  8. PDF/A-3u