问题

问题

标题基本说明了一切。转换为受信任的 PDF是一个很有价值的工具,如果能在 Ubuntu 生态系统中实现它就太好了。

编辑:'可信 PDF' 是一种 PDF 文件,它仅包含 (a) 每页由可信进程(即在为此目的而启动的可信 VM 中)生成的光栅图像,以及(可选)来自这些光栅图像的文本的 OCR。

答案1

问题

您有一个不受信任的 PDF 文件。它可能包含恶意软件,该恶意软件可能会感染您的计算机并对其造成可怕的影响。

您想将此 PDF 转换为不包含任何恶意软件的“受信任”PDF,同时又不危及您的 Ubuntu 计算机。

方法

这个想法是安装多程在您的 Ubuntu 计算机上,使用默认的主虚拟机 (VM) 来“扁平化”不受信任的 PDF 文件。扁平化 PDF 的过程包括将 PDF 文件转换为 PostScript (PS) 文件,然后将 PS 文件转换回 PDF。生成的 PDF 是“受信任的”,因为原始 PDF 中的任何恶意软件都无法在双重转换过程中幸存下来。

最后,一旦转换完成,VM 将被销毁。这样恶意软件对原始 PDF 中的 VM 所做的任何更改都会随之销毁。

概念证明

该解决方案基于命令行,我们将在终端中输入(或粘贴)命令。

首先让我们使用以下命令在您的计算机上安装 Multipass:

sudo snap 安装 multipass

您只需执行一次。

其余工作由 bash 脚本完成。我将其称为 flatten.sh。将下面的脚本保存在您的主文件夹中并flatten.sh使其可执行。

#!/bin/bash

if [ -z $1 ]; then
    echo "No argument set. Valid argument is a PDF filename.pdf in the $HOME folder"
    read -ep "Enter filename: " FULLNAME
else
    FULLNAME=$1
fi
if [ ! -f $FULLNAME ]; then
    echo "The file $FULLNAME not found." 
    echo "Valid argument is a PDF filename.pdf in the $HOME folder"
    echo "exiting..."
    exit 1
fi

INPNAME=$(basename $FULLNAME)
DIR=$(dirname $FULLNAME)
OUTNAME="Trusted-$INPNAME"
multipass start
multipass exec primary -- sudo apt update
multipass exec primary -- sudo apt install ghostscript -y
multipass exec primary -- cp "Home/$INPNAME" .
multipass exec primary -- pdf2ps "$INPNAME" temp  
multipass exec primary -- ps2pdf temp "$OUTNAME"
multipass exec primary -- mv "$OUTNAME" Home/
multipass stop primary  
multipass delete primary
multipass purge

假设您有一个名为的文件test.pdf您不信任。使用以下命令运行脚本:

./flatten.sh test.pdf

应该test.pdf位于您的 $HOME 文件夹中。如果您的 PDF 文件位于其他文件夹中,则脚本(如其所写)将找不到它。

以下是启动此脚本后将发生的事情的列表:

  1. 将创建一个虚拟机
  2. VM 中将安装最低版本的 Ubuntu
  3. ghostscript将安装转换所需的脚本
  4. 不受信任的 PDF 文件将被复制到虚拟机的虚拟存储中。
  5. 未经验证的 PDF 将转换为临时 PS 文件,并且
  6. 临时 PS 文件将转换为带有“Truted-”前缀的“受信任”PDF。
  7. 受信任的 PDF 将被移回您的主文件夹。
  8. 虚拟机将被停止、删除并清除。

整个过程将需要一些时间,特别是启动 VM 和安装ghostscript

注意:如果不受信任的 PDF 文件非常大,Multipass VM 可能会耗尽默认分配的虚拟内存。请参阅 Multipass 文档,了解如何为 VM 分配更多内存。

缺点

据我所知,安装 Ghostscript 后,无法在 Multipass 中对主 VM 进行快照,并在下次需要清理 PDF 时旋转存储的 VM。如果可以的话,这个过程会花费更少的时间。

其他方式

实现类似结果的另一种方法可能是使用LDX/LXC 容器。LXD 支持快照,仅使用 Ghostscript 的自定义容器可能比完整 VM 轻一点。但是,我没有使用过 LXD/LXC。

希望这可以帮助

相关内容