问题描述
我最近不得不打印几个 PDF 并发送给某人,但我想编辑(涂黑)一些小文本。
快速谷歌搜索没有找到任何用于此特定目的的工具,所以我又回到了 imagemagick & 。瘸子:
-
convert document.pdf document.png
-
gimp document-0.png
-
(使用画笔将文字涂黑)
-
从 gimp 打印编辑页面
-
打印 xpdf 的剩余页面
这种策略的问题在于转换过程(从 PDF 到 PNG 或任何其他格式)会降低质量。我尝试在 gimp 中编辑 PDF,但它没有立即工作。
是否有特定的工具允许以这种方式进行编辑? (它甚至不需要 “real” 密文——我不会发送软拷贝,因此 “fake” 密文将起作用,因为硬拷贝无法被黑客攻击以揭示底层文本。)
或者,有什么技巧可以在 gimp 中编辑 PDF 吗?
最佳思路
您可以使用奥库拉。
sudo apt-get install okular
-
使用 Okular 打开 pdf。
-
按
F6
(或转到工具 –> 注释)。 -
按
8
。 -
突出显示您要编辑的文本。
-
右键单击文本,选择属性,选择 “Type” 作为 “Highlight”,按
Ok
。 -
将文件打印为 pdf(检查 “Force rasterization” 以确保已从生成的文件中删除经过编辑的文本)。
次佳思路
(本来我推荐Okular,但它并没有达到我的预期)
1. 在矢量编辑器中编辑文档
我能够在 Inkscape 中打开 PDF 文件,在一段文本上绘制一个矩形并将其打印出来。 Inkscape 是一个矢量编辑器,因此不涉及光栅化。但有些字体看起来不正确 – 可能是因为该文档是在 Windows 计算机上创建的,而我的计算机上没有字体。
请注意,只有当您要将编辑后的文档打印在纸上而不是以电子方式分发时,任何不涉及光栅化的方法都是可接受的,因为文本仍然可以在停电时检索。
2. 提高在位图编辑器中打开时的光栅化分辨率
关于Gimp中打开页面时的”quality loss”:可以直接在Gimp中打开PDF文件。在此过程中它将被光栅化。该过程中的质量损失量取决于您在导入时选择的分辨率 – 300 dpi 应该会给您带来非常不错的质量(默认值为 100)。
如果您告诉 ImageMagick 的 convert
命令提高分辨率,您也可以获得良好的结果:
convert -density 300x300 ...
第三种思路
基本上,您想要做的是突出显示/注释 PDF,但对标记不透明度和颜色具有一定的灵活性(您提到您不需要审查/删除某些内容,只需编辑)。您看过这里的答案吗:\n How can I highlight or annotate PDFs?
评价最高的答案之一推荐了 Xournal,这里没有提到它,它将是我选择的武器。它是一个允许您手写笔记的工具,但还具有额外的功能,允许您对 PDF 进行注释。默认情况下,它将您的注释保存为单独的文件,但也允许您将带注释的 PDF 导出为新的 PDF。这应该保持布局、字体等。
使用 Xournal,您可以选择 “Annotate PDF”,然后使用纯黑色标记来遮盖您想要编辑的部分,然后“导出为 PDF”。
互联网上有一些故事表明 Xournal 对导出的 PDF 中的文本进行光栅化(感谢 MHC 指出这一点)。这似乎并非如此:使用简单的注释,文本仍然可以选择和搜索,并且文件大小不会增加太多(在下面的示例中,文件大小从 205 kb 增加到 220 kb)。
要安装,请在终端中运行:sudo apt-get install xournal
或从软件中心选择它
\n
第四种思路
我每天都会编辑大量 PDF 文件,因此我花了很多时间思考如何以最好的方式进行编辑。
对我来说,最好的方法是将 PDF 拆分为 1 页 PDF 文件,然后使用 GIMP 进行编辑,然后将其合并。我不在所有文件上使用 imagemagick(我根本不使用),因此我不会在所有页面上丢失 text-layer,但仅在编辑后丢失。不要一次加载整个 PDF 文件,因为这会导致内存耗尽。
将 PDF 拆分为一页文件
您可以通过此 bash 函数轻松将 PDF 文件拆分为一页 PDF(将其放入 ~/.bashrc 中):
function pdf_split(){
for file in "$@"; do
if [ "${file##*.}" != "pdf" ]; then
echo "Skip $file because it's not PDF file";
continue
fi;
pages=$(pdfinfo "$file" | grep "Pages" | awk '{print $2}')
echo "Detect $pages in $file";
filename="${file%.*}";
unset Outfile;
for i in $(seq 1 "$pages"); do
pdftk "$file" cat "$i" output "$filename-$i.pdf";
Outfile[$i]="$filename-$i.pdf";
done;
done;
};
您现在可以输入split_pdf file.pdf
来获取大量PDF文件。
编辑文件
但是,现在您需要编辑所有这些文件。 \n你可以使用 gimp original-filename-*.pdf
来完成。\n我建议在 GIMP 中配置快捷方式(主窗口 -> 编辑 -> 快捷方式)来替换文件(我使用 CTRL+R)、模糊滤镜(例如 CTRL+D)、关闭文件(例如 CTRL+W)并退出 GIMP(例如 CTRL+Q)。请记住不要一次在 GIMP 中加载多个文件,而是在打开 GIMP 后加载,这样您就可以在数千个文件上安全地使用 gimp original-filename-*.pdf
。
合并文件
您可以轻松地组合文件:pdftk originam-filename-*.pdf cat output "new-file-anon.pdf";
将它们连接在一起
这些操作非常重复且无聊,所以我将它们全部连接在 1 个脚本中:
function pdf_redact(){
for file in "$@"; do
if [ "${file##*.}" != "pdf" ]; then
echo "Skip $file because it's not PDF file";
continue
fi;
pages=$(pdfinfo "$file" | grep "Pages" | awk '{print $2}')
echo "Detect $pages in $file";
filename="${file%.*}";
unset Outfile;
for i in $(seq 1 "$pages"); do
pdftk "$file" cat "$i" output "$filename-$i.pdf";
Outfile[$i]="$filename-$i.pdf";
done;
gimp "${Outfile[@]}";
pdftk "${Outfile[@]}" cat output "$filename-anon.pdf";
rm "${Outfile[@]}";
read -p "Do you want open output file? " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
evince "$filename-anon.pdf";
fi
read -p "Do you want upload output file to Scribd.com? " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
scribd_up "$filename-anon.pdf";
fi
done;
};
该脚本的最新版本始终可以在以下位置访问:http://dostep.jawne.info.pl/it/bashrc
请记住在完成所有编辑后关闭 GIMP (CTRL+Q) 以继续脚本。
上瘾的是,我打开编辑的文件(我喜欢阅读以检查是否全部)并使用我的其他脚本 – scribd_up 上传到 Scribd,所以现在我可以非常有效地编辑大量 PDF 文件。
第五种思路
由于这里的许多解决方案建议通过注释进行编辑/涂黑(将原始内容保留在 pdf 中),因此我建议随后对 pdf 进行光栅化以真正删除原始内容。 (不要成为 this guy 。)
这是一种方法,可以同时保持较高的质量和较低的文件大小(至少在我的一堆黑白页面的情况下):
$ convert -quality 100 -density 180 -compress zip notreallyredacted.pdf trulyredacted.pdf
注意:convert
需要 ImageMagick。
注 2:convert
不会保留您可能已填写的表格内容。为了使其不丢失,您可能需要先将文档“打印到文件”,例如 evince
(或在您填写表格的任何应用程序中),然后对其进行光栅化。
第六种思路
Xournalpp 是 Xournal 的一个流行变体,它可以满足您的需求。它无法通过包管理器(在 Ubuntu 20.10 上)使用,但可以使用 CMake 构建 Github 版本。
构建指令 here 建议以下依赖项:
sudo apt-get install cmake libgtk-3-dev libpoppler-glib-dev portaudio19-dev libsndfile-dev libcppunit-dev dvipng texlive libxml2-dev liblua5.3-dev libzip-dev librsvg2-dev gettext lua-lgi
然后,在 Xournalpp 中,您应该选择矩形图标,以及笔颜色旁边的油漆桶图标。然后您可以创建填充矩形 – 但它们将是透明的。要使它们完全不透明,请选择 Tools > Pen Options > Fill Transparency
并将弹出窗口更改为 100%。 (Github 问题 here 对此进行了解释。)