วันศุกร์ที่ 30 สิงหาคม พ.ศ. 2567

แปลงเอกสารด้วย Pandoc (ตอนที่ 3)

ก่อนหน้านี้เคยเขียนบล็อกเรื่องการแปลงเอกสารด้วย Pandoc ไปทั้ง ตอนที่ 1 และ ตอนที่ 2 แล้ว หลังจากที่พบว่าโปรแกรม Pandoc ที่ผมใช้อยู่มันเป็นเวอร์ชันที่เก่าแล้ว (2.7.x) มี bug เรื่องการแปลงฟอร์แมต markdown นิดหน่อย คือตัว ~~ ไม่แปลงเป็นตัวขีดฆ่า และไม่แปลงตัวหนาตัวเอนใน docx (แต่แปลงให้ใน odt) ก็เลยไปอัปเดตให้เป็น เวอร์ชันล่าสุด (เวอร์ชัน 3.3.1 - 29 Jul 2024) ซึ่งเวอร์ชันนี้มีบางจุดเปลี่ยนไปจากรุ่นก่อน เลยต้องมาเขียนบันทึกเพิ่ม

ผมใช้ Linux Mint (Ubuntu based) เลยดาวน์โหลดไฟล์ pandoc-3.3-1-amd64.deb มาติดตั้ง ถ้าใช้ Windows, Mac ก็เลือกตามระบบที่ใช้

ถ้ามีเวอร์ชันก่อนหน้าติดตั้งเอาไว้ ต้องลบของเดิมออกถึงค่อยติดตั้งเวอร์ชันใหม่ โดยพิมพ์ในเทอร์มินัลว่า

sudo apt remove pandoc


วิธีการติดตั้ง โดยปกติจะดับเบิลคลิกไฟล์เพื่อเปิด package installer ให้ติดตั้งได้เลย แต่ถ้าไม่ได้ ก็ใช้วิธีติดตั้งผ่านเทอร์มินัล โดยพิมพ์ว่า

sudo dpkg -i ไฟล์ติดตั้งที่ดาวน์โหลด


เวอร์ชันที่ผมใช้ก่อนหน้านี้ การแปลงเป็น markdown กับ plain (text ข้อความธรรมดา) มันจะตัดแบ่งบรรทัดให้อัตโนมัติ ถ้าไม่อยากให้มันแบ่งต้องใส่ --wrap=none ไว้ด้วย เช่น

pandoc -t markdown-smart --wrap=none file-in.docx > file-out.md

หากแปลงเป็น html มันจะไม่ตัดบรรทัดให้ และผมก็เคยชินแบบนั้น แต่หลังจากที่อัปเดตมาเป็นเวอร์ชัน 3.3.1 ก็เจอว่าตอนแปลงเป็น html มันก็ตัดบรรทัดให้ด้วย ดังนั้นจึงต้องใส่แท็ก --wrap=none ไว้เช่นกัน

ที่จริงนอกจาก none แล้วก็ยังมีตัวเลือก preserve อีกด้วย ในคู่มือการใช้งานบอกไว้ว่า

--wrap=auto|none|preserve

Determine how text is wrapped in the output (the source code, not the rendered version). With auto (the default), pandoc will attempt to wrap lines to the column width specified by --columns (default 72). With none , pandoc will not wrap lines at all. With preserve , pandoc will attempt to preserve the wrapping from the source document (that is, where there are nonsemantic newlines in the source, there will be nonsemantic newlines in the output as well). In ipynb output, this option affects wrapping of the contents of markdown cells.


นอกจากนี้ก็ยังมีเรื่องที่รู้เพิ่มมาก็คือเราสามารถตั้งค่าไฟล์เอกสาร docx, odt ที่แปลงออกมาแล้วโดยใช้ต้นแบบเอกสารที่เราสร้างขึ้นมาได้อีกด้วย (จำพวกรูปแบบตัวอักษร ตั้งค่าหน้ากระดาษ) โดยการใส่พารามิเตอร์ --reference-doc แล้วอ้างถึงตำแหน่งไฟล์ที่จะใช้เป็นต้นแบบ (ถ้าอยู่คนละที่ ก็ต้องใส่ path ให้ครบด้วย หรือจะใส่เป็น url ก็ได้)

เช่น

pandoc  --reference-doc file-ref.docx -t docx file-in.md > file-out.docx

ซึ่งจาก https://pandoc.org/MANUAL.html#option--reference-doc ระบุไว้ว่าไฟล์ต้นแบบนี้ควรเป็นไฟล์ที่สร้างขึ้นจาก pandoc และไม่สามารถอ้างอิง docx มาใส่ใน odt ได้ (และในทางกลับกันด้วย)


การแปลง docx ที่มีรูปภาพอยู่ในเอกสารให้เป็น html นั้น หากต้องการให้บันทึกไฟล์รูปภาพด้วย จะต้องใส่พารามิเตอร์ว่า --extract-media=. เพื่อให้สร้างโฟลเดอร์ media ขึ้นมาด้วย เช่น

pandoc --extract-media=. --wrap=none -t html file-in.docx > file-out.htm


※※※


แปลง docx เป็น plain (ใช้นามสกุล .md)

for f in *.docx ; do pandoc "${f}" -f docx -t plain --wrap=none -s -o "${f}.md" ; done


แปลง md เป็น docx โดยอ้างอิงไฟล์

for f in *.md ; do pandoc "${f}" --reference-doc file-ref.docx -f md -t docx -s -o "${f}.docx" ; done


แปลง xhtml เป็น docx

for f in *.xhtml ; do pandoc -t docx "${f}" > "${f}.docx" ; done


แปลง docx เป็น html

for f in *.docx ; do pandoc --wrap=none -t html "${f}" > "${f}.htm" ; done


เปลี่ยนนามสกุลส่วนเกิน .docx.htm ให้เหลือเป็น .htm

for f in *.docx.htm ; do mv -- "${f}" "${f%.docx.htm}.htm" ; done

※※※

พารามิเตอร์ของ Pandoc ค่อนข้างหลากหลาย ใช้คำได้หลายคำเพื่อทำหน้าที่เดียวกัน อย่างเช่น

การกำหนดประเภทของไฟล์ต้นทาง

-f FORMAT, -r FORMAT, --from=FORMAT, --read=FORMAT

การกำหนดประเภทของไฟล์ปลายทาง

-t FORMAT, -w FORMAT, --to=FORMAT, --write=FORMAT


อ่านเพิ่มเติมได้ที่ Pandoc User’s Guide


[ Reference ]

How to specify the font used for word doc exported using pandoc?

How do I add custom formatting to docx files generated in Pandoc?

Pandoc option--reference-doc


[ Keywords ]

แปลงเอกสาร, แปลงไฟล์

ไม่มีความคิดเห็น:

แสดงความคิดเห็น