เรียกใช้งาน LibreOffice Headless ใน Docker เพื่อแปลงไฟล์ PDF

ใช่แล้ว สำหรับการแปลงเอกสารแบบครั้งเดียว ให้สร้างอิมเมจ Docker ขนาดเล็กที่มี LibreOffice ติดตั้งอยู่ แล้วเรียก ใช้ soffice --headlessด้วย คำสั่ง `docker --convert-torun`ตั้งค่าไดเร็กทอรีอินพุตเป็นแบบอ่านอย่างเดียว และตั้งค่าไดเร็กทอรีเอาต์พุตแยกต่างหากให้มีสิทธิ์เขียน เพื่อให้ไฟล์ PDF ปรากฏบนโฮสต์ของคุณ ตัวอย่างนี้ใช้ภาพอิมเมจที่ใช้ Debian และแปลงไฟล์ DOCX หนึ่งไฟล์เป็น PDF โดยไม่ได้เปิดเผย LibreOffice เป็นบริการเครือข่าย

โปรแกรมแก้ไขเทอร์มินัลที่แสดงไฟล์ Dockerfile บนระบบปฏิบัติการ Debian ซึ่งติดตั้ง LibreOffice Writer และฟอนต์ไว้แล้ว
ไฟล์ Dockerfile จะติดตั้ง LibreOffice Writer และแพ็กเกจฟอนต์พื้นฐาน จากนั้นใช้ soffice เป็นคำสั่งคอนเทนเนอร์

โหมดไร้หัว (headless mode) ทำอะไรได้บ้าง และ Docker มีประโยชน์เมื่อใด?

โหมดไร้หัว (Headless mode) จะเริ่มต้น LibreOffice โดยไม่มีส่วนติดต่อผู้ใช้แบบกราฟิก เอกสารของ LibreOffice ระบุโหมดนี้สำหรับการใช้งานผ่านบรรทัดคำสั่งและ API และตัวเลือกบรรทัดคำสั่งรองรับการแปลงไฟล์พร้อมไดเร็กทอรีเอาต์พุต Docker บรรจุแอปพลิเคชันและส่วนประกอบที่จำเป็นเพื่อให้สคริปต์หรือเวิร์กสเตชันสามารถเรียกใช้ภาพคอนเทนเนอร์เดียวกันได้โดยไม่ต้องติดตั้งชุดโปรแกรมเดสก์ท็อปบนโฮสต์

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

1. สร้างโฟลเดอร์สำหรับข้อมูลนำเข้าและข้อมูลส่งออก

บนระบบ Linux หรือ macOS ที่ใช้ Bash หรือเชลล์ที่คล้ายกัน ให้สร้างโฟลเดอร์โปรเจ็กต์ที่มีไดเร็กทอรีแยกต่างหาก ใส่เอกสารต้นฉบับไว้ในไดเร็กทอรีแรกinputและเว้นoutputว่างไว้ในไดเร็กทอรีถัดไปสำหรับการรันครั้งแรก:

mkdir -p lo-work/input lo-work/output
cp report.docx lo-work/input/
cd lo-work

คำสั่ง Docker ด้านล่างนี้ใช้เส้นทางแบบ Unix และไวยากรณ์เชลล์ บน Windows ให้ปรับไวยากรณ์เส้นทางโฮสต์สำหรับ PowerShell หรือ Command Prompt และตรวจสอบให้แน่ใจว่า Docker Desktop ได้รับอนุญาตให้แชร์ไดรฟ์ที่มีโฟลเดอร์เหล่านี้อยู่

2. สร้างอิมเมจด้วย LibreOffice

สร้างไฟล์ชื่อDockerfileinside lo-workโดยใส่เนื้อหาดังนี้:

FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y --no-install-recommends \
    libreoffice-writer fonts-liberation \
    && rm -rf /var/lib/apt/lists/*

ENTRYPOINT ["soffice"]

libreoffice-writerโปรแกรมนี้จัดเตรียม Writer และตัวกรองการแปลงที่จำเป็นสำหรับรูปแบบไฟล์ประมวลผลคำทั่วไป เพิ่มlibreoffice-calcหรือlibreoffice-impressหากคอนเทนเนอร์ต้องแปลงสเปรดชีตหรืองานนำเสนอ ชุดฟอนต์เป็นเพียงพื้นฐานเท่านั้น ติดตั้งฟอนต์ที่เอกสารของคุณต้องการและมีสิทธิ์ใช้งาน เนื่องจากฟอนต์ที่ขาดหายไปอาจส่งผลต่อการขึ้นบรรทัดใหม่และการแบ่งหน้า

สร้างอิมเมจจากไดเร็กทอรีที่มีไฟล์ Dockerfile:

docker build -t lo-headless .

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

หน้าต่างเทอร์มินัลแสดงข้อความว่า "docker build -t lo-headless . completing the container image build"
สร้างอิมเมจโลคัลจาก Dockerfile ก่อนที่จะเรียกใช้คอนเทนเนอร์สำหรับการแปลงข้อมูล

3. เรียกใช้ LibreOffice โดยใช้การเชื่อมต่อแยกต่างหาก

เริ่มต้นคอนเทนเนอร์แบบใช้แล้วทิ้งและส่งตัวเลือกการแปลงหลังจากชื่อไฟล์ภาพ ไดเร็กทอรีอินพุตเป็นแบบอ่านอย่างเดียว เฉพาะไดเร็กทอรีเอาต์พุตเท่านั้นที่สามารถเขียนได้--userตัวเลือกนี้จะเรียกใช้กระบวนการด้วยผู้ใช้และกลุ่ม ID ของโฮสต์บน Linux ในขณะที่HOME=/tmpให้ LibreOffice มีโฮมที่สามารถเขียนได้ ปรับสิทธิ์การเข้าถึงโฟลเดอร์หากผู้ใช้โฮสต์ไม่สามารถเขียนoutputได้

docker run --rm \
  --user "$(id -u):$(id -g)" \
  --env HOME=/tmp \
  -v "$PWD/input:/input:ro" \
  -v "$PWD/output:/output" \
  lo-headless \
  --headless --nologo \
  -env:UserInstallation=file:///tmp/lo-profile \
  --convert-to pdf:writer_pdf_Export \
  --outdir /output \
  /input/report.docx

--headlessคำสั่ง นี้จะปิดใช้งาน GUI --convert-to pdf:writer_pdf_Exportเลือกตัวกรองการส่งออก PDF และ--outdirส่งผลลัพธ์ไปยังโฟลเดอร์เอาต์พุตที่เชื่อมต่อไว้ เส้นทางโปรไฟล์ผู้ใช้ที่ไม่ซ้ำกันจะทำให้กระบวนการนี้มีไดเร็กทอรีการกำหนดค่า LibreOffice ที่สามารถเขียนได้ หากคุณเรียกใช้การแปลงหลายรายการพร้อมกันในคอนเทนเนอร์ที่มีอายุการใช้งานยาวนาน ให้ใช้เส้นทางโปรไฟล์ที่แตกต่างกันสำหรับแต่ละกระบวนการ

ใช้ `@mount_converter` --mountแทน-v`@mount_converter` หากคุณต้องการใช้ไวยากรณ์การ mount ที่ชัดเจนกว่าของ Docker การ mount แบบ bind จะผูกกับพาธบนโฮสต์ของ Docker daemon และการ mount แบบ read-write จะอนุญาตให้กระบวนการคอนเทนเนอร์เปลี่ยนแปลงไฟล์บนโฮสต์ได้ ควรจำกัดการ mount ให้แคบ หลีกเลี่ยงการ mount ไดเร็กทอรีโฮมหรือซ็อกเก็ต Docker ของคุณ และอย่าเรียกใช้ worker สำหรับการแปลงเอกสารด้วยสิทธิ์ที่ไม่จำเป็น

คำสั่งเทอร์มินัลที่เรียกใช้คอนเทนเนอร์ lo-headless ด้วยอินพุตแบบอ่านอย่างเดียว เอาต์พุตที่เขียนได้ การแปลงเป็นโหมด headless และโปรไฟล์แยกต่างหาก
คำสั่ง run จะส่งไฟล์ต้นฉบับไปยัง soffice ในขณะที่จำกัดการเข้าถึงของโฮสต์ไปยังโฟลเดอร์โปรเจ็กต์ทั้งสองโฟลเดอร์เท่านั้น

4. ยืนยันว่าได้สร้างไฟล์ PDF แล้ว

ตรวจสอบไดเร็กทอรีเอาต์พุตของโฮสต์หลังจาก Docker ปิดตัวลง:

ls -l output/
file output/report.pdf
test -s output/report.pdf

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

แสดงรายงานรายการเทอร์มินัลในรูปแบบไฟล์ report.pdf ในไดเร็กทอรีเอาต์พุต และระบุว่าเป็นเอกสาร PDF
ตรวจสอบว่าไฟล์เอาต์พุตมีอยู่จริงและได้รับการยอมรับว่าเป็นไฟล์ PDF จากนั้นตรวจสอบหน้าต่างๆ ว่ามีการเปลี่ยนแปลงเค้าโครงหรือไม่

หากการแปลงล้มเหลว ฉันควรตรวจสอบอะไรบ้าง?

  • ไม่มีไฟล์เอาต์พุต:โปรดยืนยันชื่อไฟล์ต้นทางและเส้นทางคอนเทนเนอร์ที่inputถูกเมานต์ไว้ที่/inputและตรวจสอบว่าไดเร็กทอรีโฮสต์นั้นoutputสามารถเขียนได้โดยผู้ใช้ที่เลือกไว้
  • ข้อผิดพลาดเกี่ยวกับโปรไฟล์หรือการล็อก:ตรวจสอบว่า-env:UserInstallationเส้นทางนั้นสามารถเขียนได้ ใช้ไดเร็กทอรีโปรไฟล์แยกต่างหากสำหรับแต่ละกระบวนการ LibreOffice ที่ทำงานพร้อมกัน
  • เค้าโครงที่เปลี่ยนแปลง:ติดตั้งฟอนต์ที่จำเป็นในรูปภาพและตรวจสอบไฟล์ PDF การแสดงผลอาจแตกต่างจากระบบเดสก์ท็อปเนื่องจากความพร้อมใช้งานของฟอนต์ ตัวกรองการส่งออก และความแตกต่างของเวอร์ชัน
  • ข้อผิดพลาดในการเมานต์ Docker:ตรวจสอบว่าไดเร็กทอรีโฮสต์ทั้งสองมีอยู่จริงก่อนใช้งาน-vหรือ--mountตรวจสอบว่าเดมอนสามารถเข้าถึงไดเร็กทอรีเหล่านั้นได้

สำหรับรายละเอียดเกี่ยวกับพฤติกรรมของตัวเลือกต่างๆ โปรดดูเอกสารอ้างอิงพารามิเตอร์บรรทัดคำสั่งของ LibreOfficeสามารถตรวจสอบชื่อแพ็กเกจได้ในรายการแพ็กเกจของ Debian Bookworm สำหรับ LibreOffice Writerเอกสารอย่างเป็นทางการของ Docker อธิบายเกี่ยว กับ bind mountsและคำแนะนำใน Dockerfile

ฝากความเห็น

ตั้งค่า LibreOffice ให้รู้จัก Java Runtime ของคุณ

ตั้งค่า LibreOffice ให้รู้จัก Java Runtime ของคุณ

ติดตั้ง Java runtime ที่เข้ากันได้ เปิดใช้งานใน LibreOffice และแก้ไขปัญหาเมื่อรายการ JRE ว่างเปล่า โดยไม่ต้องเปลี่ยนแปลงการตั้งค่าที่ไม่เกี่ยวข้อง

เรียกใช้งาน LibreOffice Headless ใน Docker เพื่อแปลงไฟล์ PDF

เรียกใช้งาน LibreOffice Headless ใน Docker เพื่อแปลงไฟล์ PDF

สร้างคอนเทนเนอร์ LibreOffice ขนาดเล็ก แปลงเอกสารสำนักงานโดยไม่ต้องใช้ GUI และตรวจสอบความถูกต้องของไฟล์ PDF ที่ส่งออก พร้อมทั้งจำกัดการเข้าถึงไฟล์จากเครื่องโฮสต์

ลดขนาดไฟล์ LibreOffice Impress โดยไม่ทำให้ภาพเบลอ

ลดขนาดไฟล์ LibreOffice Impress โดยไม่ทำให้ภาพเบลอ

ลดขนาดไฟล์งานนำเสนอ LibreOffice ที่มีขนาดใหญ่เกินไป โดยการบีบอัดรูปภาพที่ฝังอยู่ เลือกการตั้งค่าภาพที่เหมาะสม และตรวจสอบคุณภาพของสไลด์ก่อนแชร์

หยุดการตัดขอบภาพพิมพ์ขนาดกำหนดเองใน LibreOffice

หยุดการตัดขอบภาพพิมพ์ขนาดกำหนดเองใน LibreOffice

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

เร่งความเร็วมาโคร Calc ด้วยการอ่านและเขียนข้อมูลเป็นชุด

เร่งความเร็วมาโคร Calc ด้วยการอ่านและเขียนข้อมูลเป็นชุด

แทนที่การเข้าถึงเซลล์ซ้ำๆ ด้วยการอ่านและเขียนช่วงข้อมูลจำนวนมาก จากนั้นทำการวัดประสิทธิภาพผลลัพธ์และปกป้องสูตรในเวิร์กบุ๊ก Calc ขนาดใหญ่

จัดระเบียบหนังสือ LibreOffice ด้วยเอกสารหลักที่เชื่อมโยงกัน

จัดระเบียบหนังสือ LibreOffice ด้วยเอกสารหลักที่เชื่อมโยงกัน

แบ่งต้นฉบับยาวๆ ออกเป็นบทๆ รวบรวมบทเหล่านั้นในโปรแกรม Writer และรักษาความสม่ำเสมอของรูปแบบ เนื้อหา และการตรวจสอบการส่งออก

เชื่อมต่อ LibreOffice Base กับ PostgreSQL ด้วยตัวช่วยสร้างในตัว

เชื่อมต่อ LibreOffice Base กับ PostgreSQL ด้วยตัวช่วยสร้างในตัว

ใช้ตัวเลือกการเชื่อมต่อ PostgreSQL โดยตรงของ Base เพื่อป้อนรายละเอียดเซิร์ฟเวอร์ เข้าสู่ระบบ บันทึกไฟล์การเชื่อมต่อ ODB และแก้ไขปัญหาข้อผิดพลาดในการเข้าถึงทั่วไป

ทำให้ฟอนต์แบบกำหนดเองพร้อมใช้งานสำหรับ LibreOffice Flatpak

ทำให้ฟอนต์แบบกำหนดเองพร้อมใช้งานสำหรับ LibreOffice Flatpak

ติดตั้งฟอนต์ในโฟลเดอร์ฟอนต์ของผู้ใช้ Linux รีสตาร์ท LibreOffice Flatpak และตรวจสอบว่าฟอนต์ปรากฏใน Writer โดยไม่ลดระดับการรักษาความปลอดภัยแอป

แก้ปัญหาโปรแกรม LibreOffice Save ขัดข้องบน Sonoma: ทำงานในพื้นที่ก่อนเป็นอันดับแรก

แก้ปัญหาโปรแกรม LibreOffice Save ขัดข้องบน Sonoma: ทำงานในพื้นที่ก่อนเป็นอันดับแรก

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

รักษารหัส CSV ไว้ใน Calc โดยการนำเข้าเป็นข้อความ

รักษารหัส CSV ไว้ใน Calc โดยการนำเข้าเป็นข้อความ

รักษาเลขศูนย์นำหน้าใน Calc โดยการตั้งค่าคอลัมน์ ID เป็นข้อความระหว่างการนำเข้า CSV ตรวจสอบการแสดงตัวอย่าง และตรวจสอบข้อมูลที่บันทึกไว้