แปลงไฟล์เป็น PDF โดยใช้ LibreOffice ภายใต้ apache ผู้ใช้ (เช่นเมื่อใช้ PHP)


9

ฉันติดตั้ง libreoffice-headless และสามารถแปลงเอกสารเมื่อเข้าสู่ระบบเชลล์ในฐานะผู้ใช้ปกติ

[root@desktop ~]# yum install libreoffice-headless
[root@desktop ~]# yum install libreoffice-writer
[root@desktop ~]# su NotionCommotion
sh-4.1$ /usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc
convert /tmp/ayb/document_34.doc -> /tmp/ayb/document_34.pdf using writer_pdf_Export

ตอนนี้ฉันต้องการทำสิ่งเดียวกัน แต่ใช้ PHP และเป็น apache ผู้ใช้อย่างไรก็ตามสิ่งต่อไปนี้จะไม่แปลงไฟล์

<?php
  shell_exec('/usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc');
?>

ในความพยายามแก้ไขปัญหาฉันรันคำสั่งเดียวกันผ่านเชลล์ในฐานะผู้ใช้ apache แต่ก็ยังไม่สามารถแปลงไฟล์ได้:

[root@desktop ~]# su -s /bin/sh apache -c "/usr/bin/libreoffice --headless -convert-to pdf --outdir /tmp/ayb /tmp/ayb/document_34.doc"

Apache แตกต่างจากผู้ใช้ทั่วไปไม่มีบ้านและฉันจำได้ว่าได้ยินฉันอาจต้องระบุบ้านที่ใช้HOME=/tmp/aybก่อนที่จะพยายามแปลง แต่มันก็ไม่ได้ช่วย (ฉันคิดว่าเมื่อใช้ CentOS 5.8 และอาจเป็น LibreOffice รุ่นอื่น ทำ แต่ไม่แน่ใจ)

ฉันจะแปลงไฟล์เป็น PDF โดยใช้ libreoffice ได้อย่างไรเมื่อรันเป็น apache ผู้ใช้

ระบบที่ติดตั้ง:

CentOS 6.4
httpd.x86_64                    2.2.15-28.el6.centos              @updates
libreoffice-headless.x86_64     1:3.4.5.2-16.1.el6_3              @base

คำตอบ:


14

มีสองปัญหาที่นี่ ประการแรกคือwww-data(ผู้ใช้ apache) ไม่มี$HOMElibreoffice ดังนั้นจึงไม่สามารถรันได้หากไม่มีการ$HOMEกำหนดไว้ ปัญหาที่สองคือหากคุณไม่ได้ตั้งค่านี้โดยเฉพาะ (และคุณไม่ควรทำจริงๆ) apacheไม่สามารถเข้าถึง/tmpไดเรกทอรีระบบได้ ปกติแล้วเว็บเซิร์ฟเวอร์จะทำงานในสภาพแวดล้อมที่ จำกัด และไม่สามารถเข้าถึงระบบไฟล์ได้อย่างสมบูรณ์เนื่องจากเหตุผลด้านความปลอดภัยที่ถูกต้องมาก

ดังนั้นคุณต้อง i) ให้ผู้ใช้ apache ที่บ้านและ ii) ให้ไดเรกทอรีที่มีการเข้าถึงการเขียนเพื่อสร้างtmpไดเรกทอรีในโฟลเดอร์เดียวกันที่คุณเก็บหน้าเว็บของคุณแล้วเรียกใช้phpรหัสต่อไปนี้:

<?php
  shell_exec('export HOME=/tmp && libreoffice --headless -convert-to pdf --outdir ./tmp /tmp/ayb/document_34.doc');
?>

ฉันเพิ่งทดสอบและทำงานได้อย่างสมบูรณ์บนเครื่องของฉัน ตรวจสอบให้แน่ใจว่าคุณ./tmpมีการตั้งค่าการอนุญาตเป็น 777 นอกจากนี้คุณอาจต้องรีสตาร์ท apache หากคุณเล่นมากเกินไป มันหยุดทำงานสำหรับฉันหลังจากที่ในขณะที่ฉันทำการเปลี่ยนแปลงและฉันจำเป็นต้องเริ่มต้นใหม่


ขอบคุณ terdon ใช้งานได้ดีสำหรับฉันเช่นกัน คำถามสองสามข้อ ทำไมไม่เก็บไว้ใน / tmp และไม่อยู่ในโฟลเดอร์เดียวกับที่เก็บเว็บเพจ (ฉันทดสอบแล้วมันใช้งานได้) ทำไมไม่export HOME=/tmp/ayb libreoffice --headless ...ทำงาน มีจุดประสงค์อะไรexportและเหตุใดจึงไม่HOME=/tmp/ayb; libreoffice --headless....ทำงาน
user1032531

หากคุณสามารถเขียนถึง/tmpคุณมีอิสระที่จะทำ แต่ก็เป็นความคิดที่ดีจากจุดรักษาความปลอดภัยของ vew /var/wwwเพื่อไม่ให้เข้าถึงเว็บเซิร์ฟเวอร์ของคุณไดเรกทอรีที่อยู่นอก exportเอ็กซ์พอร์ตตัวแปรทำให้พร้อมใช้งานสำหรับเชลล์ที่ตามมาทั้งหมดและ&&ตรวจสอบให้แน่ใจว่ามันรันต่อเมื่อการส่งออกสำเร็จเท่านั้น ฉันไม่แน่ใจเกี่ยวกับรายละเอียด apache สามารถค่อนข้างพิถีพิถันเกี่ยวกับการอนุญาตมันจะดีกว่าเสมอที่จะเก็บทุกอย่างไว้ในwwwโฟลเดอร์ของคุณ
terdon

ฉันผสมกับการใช้ tmp ใช่ apache สามารถเขียนถึง/tmpและสิ่งที่ดี (ฉันคิดว่า) เกี่ยวกับการใช้มันคือมันจะกำจัดไฟล์เก่าโดยอัตโนมัติ /var/wwwแต่แล้วอีกครั้งผมเห็นจุดของคุณเกี่ยวกับการรักษาทุกอย่างภายใต้
user1032531

นอกจากนี้ยังเกิดขึ้นจริงสำหรับ Ubuntu (โดยไม่มีไดเรกทอรีหลักlibreoffice --headlessตายหลังจากX11 connection rejected because of wrong authenticationข้อความ)
Stanislav Ivanov

3

ฉันมีปัญหาที่คล้ายกันใน Debian และฉันแก้ไขมัน

เรียกใช้คำสั่งของคุณ แต่ด้วยstraceการเริ่มต้นเช่นนี้:
strace -f -o output.txt soffice --headless --convert-to pdf (...)

สิ่งนี้จะสร้างล็อกไฟล์ขนาดใหญ่ที่มีการเข้าถึง API ของระบบและผลลัพธ์ทุกครั้ง
ในกรณีของฉันบางแห่งใกล้กับ 5000 มีบางอย่างเช่นนี้:
open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

ต่อไปนี้เส้นทางนี้ผมเปลี่ยนสิทธิ์ซ้ำสำหรับโฟลเดอร์ไป/var/spool/libreoffice777

หลังจากนั้นการแปลงเริ่มทำงานสำหรับผู้ใช้ทุกคน

บางทีคุณอาจได้Permission deniedไฟล์อื่นมาบ้างมันถูกจัดการอย่างเงียบ ๆ และคุณต้องแก้ไขการอนุญาตสำหรับผู้ใช้ของคุณ?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.