长话短说

长话短说

我正在尝试将一堆 PDF 编译成一个文档。ls显示文件位于我所在的目录中并且它们是可读的 ( -rw-r--r--)。但是当我尝试运行时pdftk 2017.pdf cat output test.pdf出现错误:

Error: Unexpected Exception in open_reader()
java.io.FileNotFoundException: 2017.pdf (Permission denied)
   at gnu.java.nio.channels.FileChannelImpl.open(libgcj.so.16)
   at gnu.java.nio.channels.FileChannelImpl.<init>(libgcj.so.16)
   at gnu.java.nio.channels.FileChannelImpl.create(libgcj.so.16)
   at java.io.RandomAccessFile.<init>(libgcj.so.16)
   at pdftk.com.lowagie.text.pdf.RandomAccessFileOrArray.<init>(pdftk)
   at pdftk.com.lowagie.text.pdf.PRTokeniser.<init>(pdftk)
   at pdftk.com.lowagie.text.pdf.PdfReader.<init>(pdftk)
   at pdftk.com.lowagie.text.pdf.PdfReader.<init>(pdftk)
Error: Failed to open PDF file: 
   2017.pdf
Errors encountered.  No output created.
Done.  Input errors, so no output created.

如果我向该操作添加更多文件,我只会收到每个文件的错误。

我可以从命令行重命名 PDF mv 2017.pdf foo.pdf,但出现相同的错误。Error: Unexpected Exception in open_reader() java.io.FileNotFoundException: foo.pdf (Permission denied)

如果我尝试调用一个不存在的文件,例如。 pdftk 123.pdf cat output test.pdf我收到一个不同的错误:

Error: Unable to find file.
Error: Failed to open PDF file: 
   123.pdf
Errors encountered.  No output created.
Done.  Input errors, so no output created.

甚至还tail 2017.pdf显示了 2017.pdf 的最后几行:

<<
/Info 63 0 R
/ID [<cc59759cedaf07420bbe3250ba5d8971><f259ad128310d106c7aa80b673c4bd70>]
/Root 62 0 R
/Size 64
>>
startxref
42883
%%EOF

如果我可以看到该文件并使用 读取它tail,为什么无法pdftk读取它?

答案1

长话短说

Snaps 访问权限管理似乎是问题

要解决此问题,您可以:

  • 从 $HOME 文件夹中进行工作。请注意,符号链接将不起作用。
  • 从您的发行版以外的其他来源安装 pdftk。例如,ppa:malteworld/ppa具有 3.0.0 版本pdftk-java

原回复

我有同样的问题。我是从 USB 驱动器上的文件夹中执行此操作的。事实上,从我的主目录的子文件夹中执行此操作是可行的。

这让我很困惑,因为我试图从 /tmp 下的子文件夹中执行此操作,但它也不起作用(有一个不同的错误,不太详细,“无法打开 PDF 文件”)。如果我尝试从安装在 /mnt 下的辅助磁盘上的子文件夹进行尝试,情况也是如此。

我怀疑这可能与快照的限制有关(我使用的是最新的 Ubuntu 18.04.3)。但我处理快照的经验很少,所以我无法进一步探索。

如果是这样,那就很糟糕了,因为这会阻止 Ubuntu 用户从主文件夹以外的任何地方使用 pdftk。例如。 USB 驱动器、额外磁盘、共享网络驱动器。

(抱歉,我无法回复评论,声誉不够......)

答案2

另一个解决方案作为一部分发布GitHub 问题#7对于 pdftk 项目:

sudo ln -s /snap/pdftk/current/usr/bin/pdftk /usr/bin/pdftk

它更简单,但确实需要sudo权限。这在 Ubuntu 18.04 上对我有用。

在同一 GitHub 问题中,另一位用户提到

sudo ln -s /snap/pdftk/current/usr/bin/pdftk /usr/bin/pdftk
sudo rm /snap/bin/pdftk
sudo ln -s /usr/bin/pdftk /snap/bin/pdftk

这本质上是同一件事,但也替换/snap/bin/pdftk为符号链接/usr/bin/pdftk(如果/snap/bin出现/usr/bin在您的之前,则很有用$PATH)。

答案3

对于与 /snap 不同的驱动器上的文件,对我有用的解决方案是将 pdftk 访问扩展到可移动媒体:

snap connect pdftk:removable-media

答案4

从 snap 安装它(来自 Arch 存储库),但我仍然看到奇怪的东西。与您不同的权限错误,只是您尝试加载不存在的文件时看到的错误。幸运的是pdftk可以使用 .stdin 从 stdin 读取数据-。您只有一个文件,因此您可以将cat其放入

cat 2017.pdf | pdftk - cat output test.pdf

相关内容