pdftex 在 bash 脚本中失败
pdftex fails in a bash script
我有 bash 脚本,它采用小册子格式 PDF 并将其转换为单独的页面。该脚本由php 运行ning在nginx下调用
我正在使用pdfcrop,它调用了pdfTex,这是失败的地方。
脚本 运行 在命令行中以 root 身份运行良好。但是,当 nginx 运行(脚本通过 php 调用)时,pdfcrop 调用 pdfTex.
时失败
这是失败点所在的行:
pdfcrop --ini --verbose --bbox "0 0 1000 600" --margins "-490 10 10 10" ${tempDir} ${tempDir}right.pdf
我记录了详细的输出并得到以下信息:
nginx
PDFCROP 1.40, 2020/06/06 - Copyright (c) 2002-2020 by Heiko Oberdiek, Oberdiek Package Support Group.
* PDF header: %PDF-1.5
* Running ghostscript for BoundingBox calculation ...
GPL Ghostscript 9.25 (2018-09-13)
Copyright (C) 2018 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 2.
Page 1
%%BoundingBox: 90 83 972 571
* Page 1: 0 0 1000 600
%%HiResBoundingBox: 90.674997 83.069997 971.999970 570.725983
Page 2
%%BoundingBox: 33 23 969 572
* Page 2: 0 0 1000 600
%%HiResBoundingBox: 33.731999 23.939999 968.147970 571.697983
* Running pdfTeX ...
第一行'nginx'是因为我记录了whomimi的结果来确认哪个用户在运行正在运行脚本。请注意,脚本仅在 pdfTex 调用处停止。
同样,当 运行 从命令行以 root 身份运行时,脚本可以正常工作。
nginx 用户似乎无法使用 pdfTex。如果是这样,我该如何解决?
TIA
编辑:认为问题可能出在权限上,pdfTex 无法写入其临时文件,我将脚本 运行s 所在目录的所有者和组更改为 nginx。结果是一样的
编辑 2:这是对我的脚本的 PHP 调用:
chdir($scriptDir);
$result = shell_exec('./friedensBulletin.sh' . ' ' . $bulletinName . ' ' . $bulletinName);
chdir($cwd);
$scriptDir 是我的脚本所在的位置。 $cwd 设置为当前工作目录,然后在此处重置。
编辑 3:整个 bash 脚本
#!/bin/bash
#################################################
# takes a PDF, crops, exports as html #
# req. pdfcrop for cropping #
# req. poppler (pdftohtml) for file conversion #
# input file #
# output file #
# author: roger@rogercreasy.com #
# 01.09.2021 #
#################################################
tempDir="tmp/"
# handle pages 1 and 3
pdfcrop --ini --bbox "0 0 1000 600" --margins "-490 10 10 10" ${tempDir} ${tempDir}right.pdf
pdfseparate ${tempDir}right.pdf ${tempDir}right%d.pdf
#handle pages 2 and 4
pdfcrop --ini --bbox "0 0 1000 600" --margins "10 10 -490 10" ${tempDir} ${tempDir}left.pdf
pdfseparate ${tempDir}left.pdf ${tempDir}left%d.pdf
#recombine in the correct order
pdfunite ${tempDir}right1.pdf ${tempDir}left2.pdf ${tempDir}right2.pdf ${tempDir}left1.pdf ${tempDir}tmp.pdf
mv ${tempDir}tmp.pdf
# clean up uneeded files
rm ${tempDir}*.pdf
我最初认为 pdfTex 对 nginx 用户不可用的理论是正确的。
在我的脚本中,我记录了 which pdftex
的结果。此命令返回未找到。解决方案是为 pdftex 脚本创建一个 symlink。我通过在我的脚本中添加以下内容来做到这一点。
if ! [[ -L "pdftex" ]]; then
ln -s /bin/pdftex pdftex
fi
这会检查 link 是否存在,如果不存在则创建它。如果移动到另一台服务器,这种方法允许我的脚本工作,当然假设 pdftex 始终安装在同一位置。我通过 运行 `which pdftex' 在命令行上作为 root 找到了 pdftex 的位置。
感谢 pdfcrop 的作者 Heiko Oberdiek 帮助解决了这个问题。
我有 bash 脚本,它采用小册子格式 PDF 并将其转换为单独的页面。该脚本由php 运行ning在nginx下调用
我正在使用pdfcrop,它调用了pdfTex,这是失败的地方。
脚本 运行 在命令行中以 root 身份运行良好。但是,当 nginx 运行(脚本通过 php 调用)时,pdfcrop 调用 pdfTex.
时失败这是失败点所在的行:
pdfcrop --ini --verbose --bbox "0 0 1000 600" --margins "-490 10 10 10" ${tempDir} ${tempDir}right.pdf
我记录了详细的输出并得到以下信息:
nginx
PDFCROP 1.40, 2020/06/06 - Copyright (c) 2002-2020 by Heiko Oberdiek, Oberdiek Package Support Group.
* PDF header: %PDF-1.5
* Running ghostscript for BoundingBox calculation ...
GPL Ghostscript 9.25 (2018-09-13)
Copyright (C) 2018 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 2.
Page 1
%%BoundingBox: 90 83 972 571
* Page 1: 0 0 1000 600
%%HiResBoundingBox: 90.674997 83.069997 971.999970 570.725983
Page 2
%%BoundingBox: 33 23 969 572
* Page 2: 0 0 1000 600
%%HiResBoundingBox: 33.731999 23.939999 968.147970 571.697983
* Running pdfTeX ...
第一行'nginx'是因为我记录了whomimi的结果来确认哪个用户在运行正在运行脚本。请注意,脚本仅在 pdfTex 调用处停止。
同样,当 运行 从命令行以 root 身份运行时,脚本可以正常工作。 nginx 用户似乎无法使用 pdfTex。如果是这样,我该如何解决?
TIA
编辑:认为问题可能出在权限上,pdfTex 无法写入其临时文件,我将脚本 运行s 所在目录的所有者和组更改为 nginx。结果是一样的
编辑 2:这是对我的脚本的 PHP 调用:
chdir($scriptDir);
$result = shell_exec('./friedensBulletin.sh' . ' ' . $bulletinName . ' ' . $bulletinName);
chdir($cwd);
$scriptDir 是我的脚本所在的位置。 $cwd 设置为当前工作目录,然后在此处重置。
编辑 3:整个 bash 脚本
#!/bin/bash
#################################################
# takes a PDF, crops, exports as html #
# req. pdfcrop for cropping #
# req. poppler (pdftohtml) for file conversion #
# input file #
# output file #
# author: roger@rogercreasy.com #
# 01.09.2021 #
#################################################
tempDir="tmp/"
# handle pages 1 and 3
pdfcrop --ini --bbox "0 0 1000 600" --margins "-490 10 10 10" ${tempDir} ${tempDir}right.pdf
pdfseparate ${tempDir}right.pdf ${tempDir}right%d.pdf
#handle pages 2 and 4
pdfcrop --ini --bbox "0 0 1000 600" --margins "10 10 -490 10" ${tempDir} ${tempDir}left.pdf
pdfseparate ${tempDir}left.pdf ${tempDir}left%d.pdf
#recombine in the correct order
pdfunite ${tempDir}right1.pdf ${tempDir}left2.pdf ${tempDir}right2.pdf ${tempDir}left1.pdf ${tempDir}tmp.pdf
mv ${tempDir}tmp.pdf
# clean up uneeded files
rm ${tempDir}*.pdf
我最初认为 pdfTex 对 nginx 用户不可用的理论是正确的。
在我的脚本中,我记录了 which pdftex
的结果。此命令返回未找到。解决方案是为 pdftex 脚本创建一个 symlink。我通过在我的脚本中添加以下内容来做到这一点。
if ! [[ -L "pdftex" ]]; then
ln -s /bin/pdftex pdftex
fi
这会检查 link 是否存在,如果不存在则创建它。如果移动到另一台服务器,这种方法允许我的脚本工作,当然假设 pdftex 始终安装在同一位置。我通过 运行 `which pdftex' 在命令行上作为 root 找到了 pdftex 的位置。
感谢 pdfcrop 的作者 Heiko Oberdiek 帮助解决了这个问题。