Kullanıcı apache altında LibreOffice kullanarak dosyayı PDF'ye dönüştürün (yani PHP kullanırken)


10

Libreoffice-headless'ı yükledim ve normal bir kullanıcı olarak kabukta oturum açtığında belgeleri dönüştürebilirim.

[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

Şimdi aynı şeyi yapmak istiyorum, ancak PHP ve bu nedenle kullanıcı apache olarak kullanmak, ancak, aşağıdaki dosyayı dönüştürmez.

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

Sorun gidermek için, kullanıcı apache ile aynı komutu kabuk üzerinden çalıştırdım, ancak yine de dosyayı dönüştürmez:

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

Apache normal kullanıcıların aksine bir ev yok ve işitme hatırlamak hatırlıyorum HOME=/tmp/aybdönüştürmek için önce bir ev belirtmek gerekebilir , ama yardımcı değil (Sanırım CentOS 5.8 ve muhtemelen farklı bir LibreOffice sürümü kullanırken, o yaptı, ancak emin değilim).

Kullanıcı apache olarak çalıştırırken libreoffice kullanarak dosyayı PDF'ye nasıl dönüştürebilirim?

Kurulu Sistem:

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

Yanıtlar:


15

Burada iki problem mevcut. Birincisi www-data(apache kullanıcısı) tanımlanmamışsa $HOMElibreoffice çalışamaz $HOME. İkinci sorun, özellikle bu şekilde ayarlamadıysanız (ve gerçekten gerçekten yapmamanız), apachesistem /tmpdizinine erişiminin olmamasıdır . Bir web sunucusu normalde kısıtlı bir ortamda çalışır ve çok geçerli güvenlik nedeniyle dosya sistemine tam erişime sahip değildir.

Bu nedenle, i) apache kullanıcısına bir ev vermeniz ve ii) ona yazmak için erişebileceği bir dizin vermeniz gerekir. Bu nedenle, tmpweb sitenizi sakladığınız aynı klasörde bir dizin oluşturun ve ardından aşağıdaki phpkodu çalıştırın :

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

Az önce test ettim ve makinemde mükemmel çalışıyor. ./tmpİzinlerinizin 777 olarak ayarlandığından emin olun. Ayrıca, çok fazla oynarsanız apache'yi yeniden başlatmanız gerekebilir. Değişiklikler yaptığımda bir süre sonra çalışmayı bıraktı ve yeniden başlatmam gerekiyordu.


Teşekkürler terdon, benim için de mükemmel çalışıyor. Birkaç soru. Neden onları / tmp içinde tutmuyorsunuz ve web sayfalarının depolandığı klasörde değil (Test ettim, işe yarıyor). Neden çalışmıyor export HOME=/tmp/ayb libreoffice --headless ...? Amaç nedir exportve neden HOME=/tmp/ayb; libreoffice --headless....işe yaramıyor?
user1032531

Eğer gerçekten yazabilirsiniz eğer bunu yapmakta /tmpözgürsünüz. Ancak, güvenlik sunucusundan web sunucunuza dışarıdaki dizinlere erişim vermemek iyi bir fikirdir /var/www. exportdeğişkeni dışa aktarır, bunu sonraki tüm kabuklar için kullanılabilir &&hale getirir ve yalnızca dışa aktarma başarılı olursa çalışmasını sağlar. Ayrıntılar hakkında emin değilim, apache izinler hakkında oldukça titiz olabilir, her şeyi wwwklasörünüz altında tutmak her zaman daha iyidir .
terdon

Ben tmp kullanıyorum. Evet, apache yazabilir /tmpve kullanımı hakkında iyi bir şey (sanırım) eski dosyaları otomatik olarak temizler. Ama sonra tekrar, her şeyi altta tutma konusundaki fikrinizi görüyorum /var/www.
user1032531

Ubuntu için de geçerlidir (ana dizin olmadan mesajdan libreoffice --headlesssonra ölür X11 connection rejected because of wrong authentication).
Stanislav Ivanov

3

Debian'da da benzer bir sorun yaşadım ve çözdüm.

Komutunuzu çalıştırın, ancak stracebaşlangıçta şu şekilde:
strace -f -o output.txt soffice --headless --convert-to pdf (...)

Bu, sistem API'sine ve sonucuna her erişime sahip büyük bir günlük dosyası üretecektir.
Benim durumumda, 5000 hattının yakınında bir yerde böyle bir şey vardı:
open("/var/spool/libreoffice/uno_packages/cache/uno_packages", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)

Bu yolu takiben, klasör /var/spool/libreofficeiçin izinleri özyinelemeli olarak değiştirdim 777.

Bundan sonra, dönüşüm her kullanıcı için çalışmaya başladı.

Belki Permission deniedbaşka bir dosyaya da girersiniz, sessizce ele alınır ve kullanıcı için izinleri düzeltmeniz gerekir?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.