如何在 Linux 中将签名 .png 添加到 PDF?

Fre*_*Ben 178 pdf evince

我有我的书面签名的扫描副本,我需要将其应用于签名块中的某些文档。我过去一直在 Windows 上执行此操作,但现在我只有 Linux。

这可能吗?如何在 Linux (Gnome 3) 中将签名图像添加到 PDF 文件?

Nat*_*ton 218

使用 Xournal,您可以注释 PDF 并添加自定义图像(例如透明的 PNG)。虽然它用于记录徒手笔记和绘图,但它也可以对 PDF 进行注释。

在 Ubuntu 上:

  • 通过 Ubuntu 软件中心安装 Xournal
  • 打开 Xournal
  • 从“文件”菜单中选择“注释 PDF”,然后选择要签名的 PDF 文件。
  • 单击工具栏中的“图像”按钮(它看起来像一个人的剪影)。
  • 单击文档。将打开一个文件浏览器对话框。
  • 选择您签名的 PNG 图像。
  • 在 PDF 上调整图像大小和位置。
  • 从文件菜单中选择“导出为 PDF”。

更多信息请访问http://www.howtogeek.com/215485/sign-pdf-documents-without-printing-and-scanning-them-from-any-device/

  • Xournal 真的有问题——当我最终设法导入签名并导出 PDF 时,扫描的 PDF 是模糊的——我的签名是生成的 pdf 上唯一清晰的元素。 (14认同)
  • 我刚刚在 arch 上用 xournal 做了这个,效果很好,但背景 pdf 来自文档,而不是扫描件。也许相关? (3认同)
  • 答案可能应该更新为包括`xournalpp` (3认同)
  • 正如@AnttiHaapala 发现的那样 - 这使得生成的 PDF 非常模糊。我不能推荐这种方法。 (2认同)

Tom*_*ell 50

我很惊讶地发现此页面上没有提及用于 Linux 的首要免费办公软件。LibreOffice Draw 将打开一个 PDF 并允许您插入图像。如果您的签名文件已作为具有透明背景的 PNG 存在于文件系统中,则可以轻而易举地将其放到页面上、更改大小并将其移动到 Draw 中。默认情况下,Draw 会将文档保存为 ODG,因此您需要将修改后的文档导出为 PDF。

  • 我尝试使用必须在其中插入签名的 PDF 进行绘图,但它找不到文档中使用的字体,然后将其替换,并且很多图像看起来都变形了。所以我改用 Xournal,这在我的情况下效果很好。 (10认同)
  • 这种方法不会将页面转换为图像是毫无价值的,因此最终结果不会产生潜在的质量损失。 (8认同)
  • LibreOffice Draw 更改了许多字体的格式(可能是系统中不可用的字体)。结果文本溢出了页面边框。 (6认同)
  • 正如其他人所指出的,LibreOffice经常完全破坏PDF文件的格式,这是官方文档所不能容忍的,所以这对于这种情况是没有用的 (5认同)
  • Draw 打开 PDF,但会增加字体大小,使文档与其自身重叠。没有简单的方法来改变字体。 (4认同)
  • 这通常对我有用,但今天我打开了一个pdf文件,随机字母大写,图像完全消失。 (4认同)

dan*_*nza 28

很多人推荐 Xournal,但我发现它可以用作我无法使用的 Gimp 版本。因此,如果您熟悉 Gimp,我建议您尝试一下。

  • 您应该有一个带有签名的文件(甚至是用手机或网络摄像头拍摄的照片),以及一个包含要签名的文档的文件。后者将是 PDF 格式,可以由 Gimp 打开
  • 如果白色不够白,则在签名上应用阈值
  • 如果文档的背景不是白色,则将签名中的白色转换为 alpha
  • 使用 Gimp 打开文档
  • 打开文档顶部的签名作为一个新层(文件 -> 打开为层)
  • 调整大小和位置
  • 合并图层
  • 导出为 PDF

当我需要签署单页文件时,我会定期执行此操作,大约需要五分钟。不幸的是,如果您需要例如签署多页文档的每一页,这将不起作用。在后一种情况下,我只需打印、签名并再次扫描!

  • 如果文档有多个页面:将页面作为图层导入(默认选项),将文档另存为“.mng”(表示多个 png)只需在 gimp 上添加 .mng 扩展名和“导出为”选项,现在进入命令行并执行:`转换 original_name.mng output_name.pdf`。就这样。顺便说一下,如果输出的分辨率较低,请在开始导入 pdf 时尝试放大 pdf 图像的大小:尝试使用“2000”之类的宽度。导出到 MNG 时,不要忘记将选项“压缩级别”检查到最大值,这样最终文件就不会太重。 (7认同)
  • 此解决方案的主要问题是它将 PDF 呈现为图像。如果原始 PDF 具有可以选择和复制的嵌入文本或表单 - 这些都将丢失。因此,如果源是扫描图像 PDF,这是一个不错的选择,但如果您想保留源上的非图像 PDF 功能 - 使用 Xournal。此外 - GIMP 中 PDF 的默认渲染分辨率为 100 ppi,该分辨率非常低并导致文本模糊 - 至少使用 600。 (7认同)
  • 我尝试了上述所有解决方案,但经过努力,它们都失败了。`xournal` 无法正常工作,它的用户界面似乎存在错误,并且在导入图像后我无法缩放或移动图像。`xv` 没有编译,需要大量的 C 代码补丁,然后最终也不起作用。`updf`,或者它的 ubuntu PPA,已经不复存在了。(在 ubuntu xenial 2016 年 12 月测试)`gimp` 是要走的路,谢谢! (3认同)
  • 这是一个美丽的解决方案!它确实需要一些图像编辑技能来创建具有透明背景的签名,并在作为图层添加到文档时缩放图像。顺便说一句,日期也可以添加到工作 XCF 文件中作为一个有点大惊小怪的层(文本大小和位置)。由此产生的 PDF 导出是完全可以接受的! (3认同)

小智 12

值得一提的是Xournal,它有一个漂亮的用户界面,允许向 PDF 文件添加文本、图像和手写笔记。我遇到的唯一问题是它似乎不能很好地处理来自原生 PDF 表单的文本。


slm*_*slm 8

我找到了这个脚本,您可以修改它以将签名附加到现有的 PDF 文件。

你也可以从这个 pastebin URL 下载它:

AskUbuntu 上也有这个问答,它有许多其他方法可以做到这一点。问答题为:如何将图片放在现有的 pdf 文件上?.

  • 问题是它创建的页面图像质量非常差。:/另一个答案(关于updf)效果更好。:) (3认同)
  • @slm:非常正确。但它仍然会创建页面的 /picture/,而不是像 updf 那样只在图像上盖章。pdftk 也能够执行此类操作,但需要像此处那样的驱动程序脚本。 (3认同)
  • 我之前使用 pdftk 和 reportlab 做过类似的事情(邮件合并在 pdf 之上):http://stackoverflow.com/questions/356502/how-to-do-mail-merge-on-top-of-a -pdf——花了很多努力才找到有效的方法。处理 PDF 的糟糕方法有很多。 (2认同)
  • 是否有不使用 `xv` 的版本?安装 `xv` 太难了,而且它不是免费软件... (2认同)

小智 7

我对uPdf有相当好的体验。

安装

sudo add-apt-repository ppa:atareao/updf
sudo apt-get update
sudo apt-get install -y updf
Run Code Online (Sandbox Code Playgroud)

然后通过在 Python 脚本中编辑 2 行来修复错误

用法

启动 uPdf,选择添加图像工具,在要签名的区域周围绘制一个矩形,然后选择带有签名的图像文件。具有透明背景的 PNG 效果最佳。

  • 大声笑,编辑 2 行 Python 代码真是太有趣了。因为我是创建该评论的人。在这里,我正在寻找一种再次签署 PDF 的方法,对 Intarwebs 上有帮助的人感到很高兴 :) (8认同)

Phi*_*ipp 7

由于一些用户提到输出文件中的错误(清晰的签名但模糊的源文档),我建议使用xournalpp ( xournal++ ) 而不是 xournal。我没有遇到任何问题。

它打包在一些发行版中(在 Arch 中,pacman -Ss xournal只显示 xournalpp)并按预期工作。

来自Arch 维基

Xournal++ (xournalpp) 是目前正在开发中的 Xournal 的继任者。如果你想要更新版本的 Xournal,那么你可以试试这个。它目前是稳定的,几乎没有导致崩溃的错误。

存储库链接:https : //github.com/xournalpp/xournalpp


小智 6

在将我自己的签名命令放入 shell 脚本时,我一直在寻找一种方法来交互选择签名应该去的区域。幸运的是,我发现了这个问题,并且Emmanuel Branlard的脚本包含了如何做到这一点的想法(使用xv)。我实现了以下几点:

  • 使用 ImageMagicksdisplay而不是xv
  • 使用stdbuf -oL-update实时预览的选项
  • 覆盖签名pdftk stamp以防止图像质量下降
  • 只从pdf文件中提取特定页面
  • 解密签名 gpg
  • 加密签名的pdf文件 pdftk
  • 清理包含签名的中间文件 wipe

所以这里是代码:

#!/bin/env zsh

#dependencies: pdftk, ImageMagick, gpg, wipe, openssl

signature=~/PGP/signature.png.gpg

f=${1%.pdf}
page=$2
density=144
bo=0.2 #baseline overlap in relation to y-size of the signature

pagecount=$(pdftk $f.pdf dump_data | grep NumberOfPages | sed "s/.*: //")
#sign on last page by default
if [ -z "$page" ]; then page=$pagecount; fi

function cleanup
{
    echo "Cleaning up..."
    rm $f.$page.pdf
    wipe $f.$page.signature.pdf $f.$page.signed.pdf $f.signed.pdf signature.png
}
trap cleanup EXIT

echo "Signing document $f.pdf on page $page."

echo "Decrypting signature..."
gpg -d $signature > signature.png
identity=$(identify -format "%w,%h,%x,%y" signature.png)
sdata=(${(s/,/)identity})

echo "Please give the signature area with two clicks and finish by pressing ‘q’!"

#extract page
pdftk $f.pdf cat $page output $f.$page.pdf
cp $f.$page.pdf $f.$page.signed.pdf
size=$(identify -format "%wx%h" $f.$page.pdf)

#select signature area
display -density $sdata[3]x$sdata[4] -immutable -alpha off -update 1 -debug X11 -log "%e" -title "sign $f.pdf#$page" $f.$page.signed.pdf 2>&1 >/dev/null | \
    grep --line-buffered "Button Press" | \
    stdbuf -oL sed -r "s/^.*\+([0-9]+)\+([0-9]+).*$/\1,\2/" | \
    while read line
do
    p1=($p2)
    p2=(${(s/,/)line})

    if [ -n "$p1" ]
    then
        p=(0 0)
        if (( p1[1] < p2[1] )); then dx=$((p2[1]-p1[1])); p[1]=$p1[1]; else dx=$((p1[1]-p2[1])); p[1]=$p2[1]; fi
        if (( p1[2] < p2[2] )); then dy=$((p2[2]-p1[2])); p[2]=$p1[2]; else dy=$((p1[2]-p2[2])); p[2]=$p2[2]; fi
        dy=$((dy*(1+bo)))

        if (( $dx*$sdata[2] > $sdata[1]*$dy ))
        then
            resize=$(((dy+0.0)/sdata[2]))
            p[1]=$((p[1]+(dx-resize*sdata[1])/2))
        else
            resize=$(((dx+0.0)/sdata[1]))
            p[2]=$((p[2]+(dy-resize*sdata[2])/2))
        fi

        echo "Inserting signature..."
        convert -density $density -size $size xc:transparent \( signature.png -resize $((resize*100))% \) -geometry +$p[1]+$p[2] -composite $f.$page.signature.pdf
        pdftk $f.$page.pdf stamp $f.$page.signature.pdf output $f.$page.signed.pdf

        unset p1 p2
    fi
done

if [ -z "$p" ]
then
    echo "You have to click two times. Aborting..."
    exit 1
fi

echo "Joining PDF pages..."
sew=( pdftk A=$f.pdf B=$f.$page.signed.pdf cat )
if (( page > 1 )); then
    sew+=A1-$((page-1))
fi
sew+=B
if (( page < pagecount )); then
    sew+=A$((page+1))-end
fi
sew+=( output $f.signed.pdf )
$sew

echo "Encrypting PDF file..."
pdftk $f.signed.pdf output $f.signenc.pdf user_pw PROMPT owner_pw $(openssl rand -base64 32) allow AllFeatures
Run Code Online (Sandbox Code Playgroud)


小智 6

Okular PDF 查看器内置了注释。打开您要签名的 PDF,选择左侧栏上的评论,然后选择弹出菜单中的第三个选项“徒手画线”。画出你的签名。如果您想要黑色墨水而不是霓虹绿,请从菜单中选择“设置”,选择“配置 Okular”,然后选择左侧的“注释”按钮。从选项中选择“手绘线”,然后选择“编辑”按钮。您可以在此处调整线条粗细和颜色。点击“应用”并享受。

  • 通过 Okular,您还可以拥有并使用您的[签名印章](https://askubuntu.com/questions/1132658/how-to-add-a-signature-stamp-to-okular)。您甚至可以[使用证书正确签署 pdf](https://superuser.com/questions/813734/how-to-sign-a-pdf-in-okular-or-other-foss-program/1610456# 1610456)。官方信息位于 https://docs.kde.org/stable5/en/okular/okular/signatures.html。 (3认同)

小智 5

在 Debian (Bullseye) 上,我发现最简单的 (?) 免费方法是使用Scribus 1.5.5,它可以轻松导入 PDF(这在早期版本中也可能):

导入 PDF,然后在您想要签名的位置制作一个图像框,选择您的签名文件,根据需要调整大小,然后导出为新的 PDF(当然,您可以使用文本框放置必要的文本,例如日期等)最终使用 GIMP 或类似工具并没有什么不同,但是如果您熟悉 Scribus,那么只需几秒钟即可完成。我刚刚完成了两次注销帐户,这就是我在这里结束的方式;)