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


65

我有一份书面签名的扫描件,需要将其应用于签名栏中的某些文档。我以前一直在Windows上执行此操作,但现在只有Linux。

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

Answers:


85

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

在Ubuntu上:

  • 通过Ubuntu软件中心安装Xournal
  • 公开报刊
  • 从“文件”菜单中选择“注释PDF”,然后选择要签名的PDF文件。
  • 单击工具栏中的“图像”按钮(看起来像一个人的轮廓)。
  • 单击文档。
  • 选择签名的PNG图片。
  • 调整图像大小并将其放置在PDF上。
  • 从“文件”菜单中选择“导出为PDF”。

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


7
Xournal确实有问题-当我最终设法导入签名并导出PDF时,扫描的PDF模糊了-我的签名是生成的pdf中唯一清晰的元素。
Antti Haapala

1
我只是在arch的xournal上进行了此操作,效果很好,但是背景pdf是来自文档,而不是扫描。也许相关?
布兰登·库曾斯基

在Ubuntu 16.04上也为我工作。作为旁注,您还可以使用xournal注释PDF,方法是在PDF顶部的不同层中添加文本(例如,用full表示完整的表单)。
jotadepicas

嗯。因此,这实际上有效,但是薄荷上的其他pdf程序不会保存文本字段...
mendota

9

值得一提的是Xournal,它具有不错的用户界面,并允许向PDF文件添加文本,图像和手写笔记。我遇到的唯一问题是它似乎无法很好地处理本机PDF表单中的文本。


8

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

您也可以从以下pastebin URL下载它:

AskUbuntu上也有此问答,它提供了许多其他方法来执行此操作。问答标题为:如何在现有的pdf文件上放置图片?


@Freedom_Ben-同样,如果您有兴趣,我发现了如何使用证书而不只是PNG对PDF进行签名。LMK。
slm

3
问题是它创建的页面图像质量很差。:/另一个答案(关于updf)效果更好。:)
odinho-Velmont,2014年

2
@slm:非常正确。但是它仍然会创建页面的/ picture /,而不是像updf那样仅在图像上加盖印记。pdftk也可以执行此类操作,但需要一个驱动程序脚本,例如此处的驱动程序脚本。
odinho-Velmont 2014年

1
之前,我曾使用pdftk和reportlab做类似的事情(在pdf之上合并邮件):stackoverflow.com/questions/356502/…-费 了很大的力气才能找到有效的方法。在那里处理PDF的方法非常繁琐。
odinho-Velmont 2014年

2
是否有不使用的版本xv?这太难安装了,xv而且它不是免费软件……
克里斯·贝克

8

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

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

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


2
我尝试了上述所有解决方案,但都付出了很多努力才失败了。xournal不能真正正常工作,它的用户界面中似乎存在错误,并且在导入图像后无法缩放或移动图像。xv没有编译,需要大量的C代码补丁,然后最终也不起作用。updf或它的ubuntu PPA不再存在。(已在ubuntu xenial 2016年12月测试)gimp是前进的道路,谢谢!
克里斯·贝克

2
这是一个很好的解决方案!确实需要一些图像编辑技能才能创建具有透明背景的签名,并在将其作为图层添加到文档时缩放图像。顺便说一句,日期也可以添加到工作的XCF文件中,只是有点麻烦(文本大小和位置)。由此产生的PDF导出是完全可以接受的!
汤姆·罗素

1
如果文档有多个页面:将页面导入为图层(默认选项),则将文档另存为“ .mng”(表示多个png),只需在gimp上添加.mng扩展名和“导出为”选项即可,现在进入命令行并执行:convert original_name.mng output_name.pdf。就这样。顺便说一句,如果输出的分辨率很低,请在开始导入pdf时尝试扩大pdf图像的尺寸:尝试使用“ 2000”之类的宽度。导出为MNG时,不要忘记将选项“压缩级别”检查到最大,这样最终文件就不会太重。
DiegoAndrésDíazEspinoza

这个答案连同这个(onlinesignature.com/es/draw-a-signature-online)就是您所需要的
Alfergon

6

我在uPdf方面有相当不错的经验。

安装

sudo add-apt-repository ppa:atareao/updf
sudo apt-get update
sudo apt-get install -y updf

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

用法

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


4
大声笑,关于编辑Python的两行真是太有趣了。因为我是创建该评论的人。在这里,我正在寻找一种再次签名PDF的方式,非常高兴能对Intarweb上的有用人员进行帮助:)
odinho-Velmont 2014年

看起来最新版本是针对Ubuntu Quantal的。使用“无法提取...”在15.04(Vivid)错误上添加回购协议
Ponkadoodle

@Wallacoloo该软件包仅适用于Raring和Saucy。对于其他分发,您需要在中lst创建的文件中手动更改分发/etc/apt/sources.list.d
kynan

使用精确或量子分布在Wily 15.10上启动屏幕后崩溃。
乔纳森·诺伊费尔德

在Debian Buster上为我工作。其他答案(如自定义脚本)使用的pdftk当前不可用,并且Xournal不在存储库中。Updf 下载页面直接下载链接sudo dpkg -i file.deb; sudo apt install -f按照答案中的说明进行安装,然后编辑Python代码。
卢克,

4

在将自己的签名命令放入shell脚本时,我正在寻找一种交互式选择签名应去的区域的方法。幸运的是,我发现了这个问题,伊曼纽尔·布兰拉德Emmanuel Branlard)的脚本包含了有关如何做到这一点的想法(带有xv)。我实现了以下几点:

  • 使用ImageMagicks display代替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

这对我不起作用,无法显示图片,但仅显示启动屏幕。
Andreas

2

为了完整起见,有一个替代脚本可以执行此操作,与到目前为止提到的脚本相比,该脚本不会将pdf转换为(低质量)图像:https : //github.com/martinruenz/signpdf

我对其他解决方案的经验是:

  • Xournal搞砸了pdf(虽然从源代码构建后似乎可以正常工作)
  • SignPDF脚本将pdf转换为图像,从而大大降低了质量。它还具有麻烦的依赖关系(xv)
  • 我没有尝试过gimpupdf选项
  • 最后,我在VM中使用了Acrobat Reader,因为我还必须填写各种表格

感谢您的分享。我将检查您的脚本。我在Xournal上取得了非常好的成功,因此您必须确保不要导出到原始文件名,因为这可能会导致问题。如果您选择要导出到的新名称(这样就不会覆盖原始的pdf),那么您将避免此错误。
Freedom_Ben

1

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


0

updf确实对此非常有帮助。使用MacOS上的预览来“签名”文档后,updf可以提供与此最接近的用户体验。

以下适用于Ubuntu 14.10和Debian 8。

我不想将第三方ppa添加到我的系统中,因此以以下方式运行updf:

$ bzr branch lp:updf

然后根据其他答案进行2行编辑

安装依赖项:

# apt-get install python-poppler gir1.2-gtk-3.0 gir1.2-gdkpixbuf-2.0 gir1.2-poppler-0.18 python-cairo librsvg2-2 gir1.2-rsvg-2.0 python-gi-cairo

(上面的内容就足够了;尽管不是每个包都必要)。

然后可以就地运行python程序:

$ ./src/updf.py

不幸的是,与输入文档相比,输出文档中的质量会受到严重影响。正确的方法是在无损过程中覆盖签名,而不更改原始签名。而updf似乎参与了原始文件的重新编码。


我必须添加python-gi-cairo依赖项才能使其正常工作。
Joma)

乔玛:谢谢。我现在将python-gi-cairo添加到列表中。
projix

0

我经营一家公司,而Xournal对我需要的pdf文件没有质量或控制范围。

我也一直在使用或应用数字签名。

Master PDF Editor(截止到目前的版本5)是一个付费应用程序,很容易超出预期,现在是Ubuntu的默认PDF阅读器。主要功能:-签署文档-填写表格-修改文本和对象-注释和突出显示文档-合并和拆分pdf文件-等等

有关更多详细信息,请访问:https : //code-industry.net/masterpdfeditor/?-about&ver=5438

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.