PDF 与 Elixir 合并,pdftk 与实现合并?

问题描述 投票:0回答:1

我正在开发一个 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
使用适当的参数执行命令。

我尝试过的:

  • 我已经检查了所涉及的文件和目录的权限,以确保我具有必要的读写访问权限。
  • 我已经通过在终端中运行 which
    pdftk
    验证了
    PATH
    命令在系统的
    pdftk
    中可用。
  • 我尝试使用相同的输入文件和输出文件直接在终端中运行 pdftk 命令,并且它可以正常工作。

预期结果:

我希望

PdfMerger.MergePdfs.method/2
函数能够成功地将输入 PDF 文件合并到指定的输出文件中,就像我直接在终端中运行
pdftk
命令时一样。

如果您需要任何其他信息,或者我可以提供其他任何信息来帮助诊断和解决问题,请告诉我。

总而言之,目标是识别并解决运行

PdfMerger.MergePdfs.method/2
函数时发生的错误,以便该函数能够成功将输入 PDF 文件合并到指定的输出文件中。

functional-programming elixir pdftk elixir-iex
1个回答
0
投票

尝试将

System.cmd
调用更改为:

System.cmd("pdftk", input_files ++ ["cat", "output", output_file])

也就是说,将每个输入文件作为单独的命令行参数传递,而不是连接文件名并将它们全部作为单个参数传递。


与您在终端中尝试的不同之处在于 shell 以空格分割命令行参数。所以在这个命令中:

pdftk one.pdf two.pdf cat output three.pdf

有五个命令行参数:

  1. one.pdf
  2. two.pdf
  3. cat
  4. output
  5. 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
传递列表中给出的参数,不多也不少:

  1. one.pdf two.pdf
  2. cat
  3. output
  4. three.pdf

此操作失败,因为没有名为

one.pdf two.pdf
的文件,且文件名中间有空格。您可以通过引用输入文件在终端中获得相同的结果:

pdftk "one.pdf two.pdf" cat output three.pdf
© www.soinside.com 2019 - 2024. All rights reserved.