我正在开发一个 Elixir 项目,该项目涉及使用 pdftk 命令行工具合并 PDF 文件。我在 Elixir 模块中编写了一个函数 PdfMerger.MergePdfs,用于使用 pdftk 命令合并 PDF。但是,当我使用输入文件调用此函数时,它会返回错误。
defmodule PdfMerger.MergePdfs do
def method(input_files, output_file) do
if pdftk_installed?() do
merge_pdfs(input_files, output_file)
else
IO.puts("Error: pdftk is not installed.")
end
end
defp command_exists?(command) do
System.cmd("which", [command]) == {"/usr/bin/#{command}\n", 0}
end
defp pdftk_installed? do
command_exists?("pdftk")
end
defp merge_pdfs(input_files, output_file) do
input_files_string = Enum.join(input_files, " ")
output_file = Path.expand(output_file)
files_exist? = Enum.all?(input_files, &File.exists?/1)
if files_exist? do
{output, status} =
System.cmd("pdftk", ["#{input_files_string}", "cat", "output", "#{output_file}"])
case status do
0 ->
IO.puts("PDFs merged successfully.")
_ ->
IO.puts("Error: PDF merging failed.")
end
else
IO.puts("Error: One or more input files do not exist.")
end
end
end
结果:
Error: Unable to find file.
Error: Failed to open input PDF file:
/zip_files_api/folder_test/3efb2f00-2be4-11ee-8303-a463a172bc38/file1.pdf /zip_files_api/folder_test/3efb2f00-2be4-11ee-8303-a463a172bc38/file2.pdf
Errors encountered. No output created.
Done. Input errors, so no output created.
我已验证
input_files
列表包含现有 PDF 文件的有效路径,并且 output_file
也是我具有写入权限的有效路径。
merge_pdfs/2
功能旨在使用pdftk
命令合并PDF文件。我正在使用 System.cmd/3
使用适当的参数执行命令。
我尝试过的:
pdftk
验证了 PATH
命令在系统的 pdftk
中可用。预期结果:
我希望
PdfMerger.MergePdfs.method/2
函数能够成功地将输入 PDF 文件合并到指定的输出文件中,就像我直接在终端中运行 pdftk
命令时一样。
如果您需要任何其他信息,或者我可以提供其他任何信息来帮助诊断和解决问题,请告诉我。
总而言之,目标是识别并解决运行
PdfMerger.MergePdfs.method/2
函数时发生的错误,以便该函数能够成功将输入 PDF 文件合并到指定的输出文件中。
尝试将
System.cmd
调用更改为:
System.cmd("pdftk", input_files ++ ["cat", "output", output_file])
也就是说,将每个输入文件作为单独的命令行参数传递,而不是连接文件名并将它们全部作为单个参数传递。
与您在终端中尝试的不同之处在于 shell 以空格分割命令行参数。所以在这个命令中:
pdftk one.pdf two.pdf cat output three.pdf
有五个命令行参数:
one.pdf
two.pdf
cat
output
three.pdf
相比之下,当运行这段 Elixir 代码时:
input_files = ["one.pdf", "two.pdf"]
input_files_string = Enum.join(input_files, " ")
output_file = "three.pdf"
System.cmd("pdftk", ["#{input_files_string}", "cat", "output", "#{output_file}"])
有四个参数,因为
System.cmd
传递列表中给出的参数,不多也不少:
one.pdf two.pdf
cat
output
three.pdf
此操作失败,因为没有名为
one.pdf two.pdf
的文件,且文件名中间有空格。您可以通过引用输入文件在终端中获得相同的结果:
pdftk "one.pdf two.pdf" cat output three.pdf