我正在编写一个 Lambda 函数,使用 unoconv 和 libreoffice 将 excel 文件转换为 PDF,为此我使用 alpine 基础图像。Dockerfile 如下。
\n# Define global args\nARG FUNCTION_DIR="/home/app/"\nARG RUNTIME_VERSION="3.9"\nARG DISTRO_VERSION="3.12"\n\n# Stage 1 - bundle base image + runtime\n# Grab a fresh copy of the image and install GCC\nFROM python:${RUNTIME_VERSION}-alpine${DISTRO_VERSION} AS python-alpine\n# Install GCC (Alpine uses musl but we compile and link dependencies with GCC)\nRUN apk add --no-cache \\\n libstdc++\n\n# Stage 2 - build function and dependencies\nFROM python-alpine AS build-image\n# Install aws-lambda-cpp build dependencies\nRUN apk add --no-cache \\\n build-base \\\n …Run Code Online (Sandbox Code Playgroud) 我想自动导出.odf文件到.pdf.
我尝试了一种叫做unoconv的东西.
在Windows命令提示符下键入时,一切都是正确的.
>"C:\Program Files (x86)\OpenOffice 4\program\python.exe" "C:\Program Files (x86)\OpenOffice 4\program\unoconv-master\unoconv" -f pdf path/to/myfile.odt
Run Code Online (Sandbox Code Playgroud)
一旦在PHP脚本中使用,就不再有用了.没有错误出现.
exec('"C:\Program Files (x86)\OpenOffice 4\program\python.exe" "C:\Program Files (x86)\OpenOffice 4\program\unoconv-master\unoconv" -f pdf path/to/myfile.odt');
//or
shell_exec('"C:\Program Files (x86)\OpenOffice 4\program\python.exe" "C:\Program Files (x86)\OpenOffice 4\program\unoconv-master\unoconv" -f pdf path/to/myfile.odt')
Run Code Online (Sandbox Code Playgroud)
我也试图逃避\或使用'和"不同,但我的测试没有一个是决定性的.
$test = exec($cmd, $output, $return);
echo var_dump($test);
echo var_dump($output);
echo var_dump($return);
Run Code Online (Sandbox Code Playgroud)
给我吗
//echo var_dump($test)give nothing
//echo var_dump($ouput);
array (size=0)
empty
//echo var_dump($return);
int 1
Run Code Online (Sandbox Code Playgroud)
这听起来像权限问题,但我也检查了这一点,所有文件夹都可以访问PHP.
我正在将文档转换为内存中的pdf(unoconv)并在终端中打印(pdftotext):
unoconv -f pdf --stdout sample.doc | pdftotext -layout -enc UTF-8 - out.txt
Run Code Online (Sandbox Code Playgroud)
工作中.现在我想用这个命令child_process.spawn:
let filePath = "...",
process = child_process.spawn("unoconv", [
"-f",
"pdf",
"--stdout",
filePath,
"|",
"pdftotext",
"-layout",
"-enc",
"UTF-8",
"-",
"-"
]);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,只有第一个命令(在|之前)正在工作.我有可能做我正在尝试的事情吗?
谢谢.
最新情况:
的结果: sh -c- ....
bash-3.2$ sh -c- unoconv -f pdf --stdout /Users/fatimaalves/DEV/xx/_input/sample.doc | pdftotext -layout -enc UTF-8 - -
sh: --: invalid option
Usage: sh [GNU long option] [option] ...
sh [GNU long option] [option] script-file ...
GNU long options:
--debug …Run Code Online (Sandbox Code Playgroud) 我unoconv用来转换docx成pdf。只要我通过文件名传递文档,一切都很好:
$ unoconv -f pdf --stdout test.docx
Run Code Online (Sandbox Code Playgroud)
但是,一旦我使用--stdin它就不再起作用了:
$ unoconv -f pdf --stdin --stdout < test.docx
Traceback (most recent call last):
File "/usr/bin/unoconv", line 1275, in <module>
main()
File "/usr/bin/unoconv", line 1185, in main
inputfn = sys.stdin.read()
File "/usr/lib/python3.5/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xad in position 41: invalid start byte
Run Code Online (Sandbox Code Playgroud)
这是同一个文件。为什么不起作用?
unoconv ×4
alpine-linux ×1
aws-lambda ×1
cmd ×1
docker ×1
encoding ×1
node.js ×1
pdftotext ×1
permissions ×1
php ×1
python ×1
spawn ×1
stdin ×1
utf-8 ×1