我正在尝试将一堆 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