Jak mogę dodać podpis .png do pliku PDF w systemie Linux?

65

Mam zeskanowaną kopię podpisu i muszę go zastosować do niektórych dokumentów w bloku podpisu. Robiłem to cały czas w systemie Windows, ale teraz mam tylko Linuksa.

czy to możliwe? Jak mogę dodać obraz podpisu do pliku PDF w systemie Linux (Gnome 3)?

Freedom_Ben
źródło

Odpowiedzi:

85

Za pomocą Xournal możesz dodawać adnotacje do plików PDF i dodawać własne obrazy (np. Przezroczysty PNG). Chociaż służy do robienia notatek i rysowania odręcznego, może także dodawać adnotacje do plików PDF.

W systemie Ubuntu:

  • Zainstaluj Xournal za pośrednictwem Centrum oprogramowania Ubuntu
  • Otwórz Xournal
  • Wybierz „Adnotuj PDF” z menu Plik i wybierz plik PDF do podpisania.
  • Kliknij przycisk „Obraz” na pasku narzędzi (wygląda jak sylwetka osoby).
  • Kliknij dokument.
  • Wybierz obraz PNG swojego podpisu.
  • Zmień rozmiar i umieść obraz w pliku PDF.
  • Wybierz „Eksportuj do PDF” z menu Plik.

Więcej informacji na http://www.howtogeek.com/215485/sign-pdf-documents-without-printing-and-scanning-them-from-any-device/

Nate Lampton
źródło
7
Xournal był naprawdę wadliwy - kiedy w końcu udało mi się zaimportować podpis i wyeksportować plik PDF, zeskanowany plik PDF został zamazany - mój podpis był jedynym wyraźnym elementem na wynikowym pliku PDF.
Antti Haapala
1
Właśnie to zrobiłem z Xournal na arch i działało całkiem nieźle, ale pdf w tle pochodzi z dokumentu, a nie ze skanu. może istotne?
Brandon Kuczenski
Pracowałem także dla Ubuntu 16.04. Jako sidenote możesz także użyć xournal do dodania adnotacji do pliku PDF poprzez dodanie tekstu na nim na różnych warstwach (przydatne na przykład do wypełniania formularzy).
jotadepicas,
hm. więc to działa, ale inne programy pdf na mennicy nie zapisują pól tekstowych ...
mendota,
9

Warto wspomnieć o Xournal, który ma ładny interfejs użytkownika i umożliwia dodawanie tekstu, obrazów i odręcznych notatek do plików PDF. Jedynym problemem, jaki miałem, jest to, że nie radzi sobie z tekstem z rodzimych formularzy PDF.

Mike Chelen
źródło
8

Znalazłem ten skrypt, który możesz zmodyfikować, aby dołączyć podpis do istniejącego pliku PDF.

Możesz go również pobrać z tego adresu URL pastebin:

Jest również to pytanie i odpowiedź na AskUbuntu, które ma wiele innych metod, aby to zrobić. Pytania i odpowiedzi są zatytułowane: Jak umieścić zdjęcie w istniejącym pliku pdf? .

slm
źródło
@ Freedom_Ben - także, jeśli jesteś zainteresowany, znalazłem sposób podpisywania plików PDF za pomocą certyfikatów zamiast tylko PNG. LMK.
slm
3
Problem polega na tym, że tworzy obrazy stron w bardzo złej jakości. : / Druga odpowiedź (o aktualizacji) działa lepiej. :)
odinho
2
@slm: Bardzo prawda. Ale nadal tworzy / obraz / strony, zamiast tylko stemplować obraz na tak, jak robi to updf. pdftk jest również w stanie wykonywać takie operacje, ale potrzebuje skryptu sterownika, takiego jak tutaj.
odinho
1
Korzystałem już z pdftk i reportlab, aby robić podobne rzeczy (scalanie poczty na górze pdf): stackoverflow.com/questions/356502/... - wiele wysiłku szukałem skutecznego sposobu. Istnieje wiele złych sposobów przetwarzania plików PDF.
odinho
2
Czy istnieje wersja, która nie używa xv? Jest zbyt trudny do zainstalowania xvi nie jest wolnym oprogramowaniem ...
Chris Beck
8

Wiele osób poleca Xournal, ale okazało się, że działa jako wersja Gimp, której nie mogę używać. Dlatego jeśli znasz Gimp, polecam wypróbowanie go.

  • Powinieneś mieć plik z podpisem (nawet zdjęcie zrobione telefonem lub kamerą internetową) oraz plik z dokumentem do podpisania. Ten ostatni będzie w formacie PDF, który może otworzyć Gimp
  • Zastosuj próg podpisu, jeśli biel nie jest wystarczająco biała
  • Konwertuj kolor biały na alfa w podpisie, jeśli tło dokumentu nie jest białe
  • Otwórz dokument za pomocą Gimp
  • Otwórz podpis na górze dokumentu jako nową warstwę (Plik -> Otwórz jako warstwę)
  • Dostosuj rozmiar i pozycję
  • Scal warstwy
  • Eksportuj jako plik PDF

Robię to regularnie, gdy muszę podpisywać jednostronicowe dokumenty, co zajmuje mi mniej więcej pięć minut. Niestety to nie zadziała, jeśli chcesz na przykład podpisać każdą stronę dokumentu wielostronicowego. W tym drugim przypadku po prostu drukuję, podpisuję i skanuję ponownie!

Danza
źródło
2
Wypróbowałem wszystkie powyższe rozwiązania, wszystkie zawiodły po dużym wysiłku. xournaltak naprawdę nie działa poprawnie, wydaje się, że w interfejsie użytkownika występują błędy i nie mogłem skalować ani przenosić obrazów po ich zaimportowaniu. xvnie skompilował się, wymaga wielu poprawek do kodu C, potem też nie działa. updflub jego ubuntu PPA, już nie istnieje. (testowane na Xenial Ubuntu w grudniu 2016 r.) gimpto droga, dzięki za to!
Chris Beck
2
To jest piękne rozwiązanie! Wymaga to pewnych umiejętności edycji obrazu, aby utworzyć podpis z przezroczystym tłem i skalować obraz po dodaniu do dokumentu jako warstwy. BTW, datę można również dodać do działającego pliku XCF jako warstwę z odrobiną zamieszania (rozmiar i lokalizacja tekstu). Wynikowy eksport pliku PDF jest całkiem do przyjęcia!
Tom Russell,
1
Jeśli dokument ma wiele stron: zaimportuj stronę jako warstwy (opcja domyślna), zapisz dokument jako „.mng” (oznacza wiele png), po prostu dodając rozszerzenia .mng i opcję „eksportuj jako” na gimp, teraz przejdź do wiersza poleceń i wykonaj : convert original_name.mng output_name.pdf. To wszystko. Nawiasem mówiąc, jeśli rozdzielczość wyjściowa jest niska, spróbuj powiększyć obraz pdf podczas importowania pdf na początku: spróbuj czegoś takiego jak „2000” dla szerokości. Podczas eksportowania do MNG nie zapomnij zaznaczyć opcji „poziom kompresji” do maksimum, dzięki czemu plik końcowy nie będzie zbyt ciężki.
Diego Andrés Díaz Espinoza
Ta odpowiedź wraz z tym ( onlinesignature.com/es/draw-a-signature-online ) jest wszystkim, czego potrzebujesz
Alfergon
6

Miałem dość dobre doświadczenia z uPdf .

Instalacja

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

Następnie napraw błąd , edytując 2 linie w skrypcie Python .

Stosowanie

Uruchom plik uPdf, wybierz narzędzie Dodaj obraz , narysuj prostokąt wokół obszaru, w którym ma się znaleźć podpis, i wybierz plik obrazu ze swoim podpisem. PNG z przezroczystym tłem działa najlepiej.

kynan
źródło
4
lol, to zabawne w edytowaniu 2 linii Pythona. Ponieważ to ja stworzyłem ten komentarz. I tutaj szukam sposobu na ponowne podpisanie pliku PDF, więc cieszę się z pomocy pomocnych osób na stronach internetowych :)
odinho - Velmont
Wygląda na to, że ostatnie wydanie dotyczyło Ubuntu Quantal. Dodanie repozytorium w błędach 15.04 (Żywe) z komunikatem „Nie udało się pobrać ...”
Ponkadoodle
@Wallacoloo Pakiet jest zbudowany tylko dla Raring i Saucy. W przypadku każdej innej dystrybucji musisz ręcznie zmienić dystrybucję w lstpliku utworzonym w /etc/apt/sources.list.d.
kynan
Awarie po ekranie powitalnym w urządzeniu Wily 15.10 przy użyciu rozkładu dokładnego lub ilościowego.
Jonathan Neufeld
Działa dla mnie w Debian Buster. Inne odpowiedzi, takie jak skrypty niestandardowe, używają pdftk, który jest obecnie niedostępny, a Xournal nie znajduje się w repozytoriach. Strona pobierania aktualizacji lub bezpośredni link do pobrania . Zainstaluj za pomocą, sudo dpkg -i file.deb; sudo apt install -fa następnie edytuj kod Python, jak wspomniano w odpowiedzi.
Luc
4

Umieszczając własne polecenia podpisu w skrypcie powłoki, szukałem sposobu interaktywnego wyboru obszaru, w którym powinien się znaleźć podpis. Na szczęście znalazłem to pytanie, a scenariusz Emmanuela Branlarda zawiera pomysł, jak to zrobić (z xv). Zaimplementowałem następujące punkty:

  • użyj ImageMagicks displayzamiastxv
  • użyj stdbuf -oLi -updateopcji, aby mieć podgląd na żywo
  • nakładaj podpis, pdftk stampaby zapobiec pogorszeniu jakości obrazu
  • wyodrębnij tylko określoną stronę z pliku pdf
  • odszyfruj podpis za pomocą gpg
  • zaszyfruj podpisany plik pdf za pomocą pdftk
  • oczyść pliki pośrednie zawierające podpis wipe

Oto kod:

#!/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
Bodo
źródło
To nie działa dla mnie, ładuje imagamagick, ale wyświetla tylko ekran powitalny.
Andreas
2

Dla kompletności istnieje alternatywny skrypt, który to robi, który nie konwertuje pliku pdf na (niskiej jakości) obraz, w przeciwieństwie do wspomnianego do tej pory : https://github.com/martinruenz/signpdf

Moje doświadczenie z innymi rozwiązaniami to:

  • Xournal zawalił plik pdf (choć wydawało się, że działa po zbudowaniu ze źródła)
  • Skrypt SignPDF konwertuje pliki PDF na obrazy i znacznie obniża jakość. Ma również kłopotliwą zależność (XV)
  • I nie spróbować GIMP i updf opcję
  • W końcu użyłem Acrobat Reader na maszynie wirtualnej, ponieważ musiałem również wypełniać różne formularze
Martin R.
źródło
Dzięki za udostępnienie. Sprawdzę twój skrypt. Miałem naprawdę dobry sukces z Xournalem, musisz jednak upewnić się, że nie eksportujesz do oryginalnej nazwy pliku, ponieważ może to powodować problemy. Jeśli wybierzesz nową nazwę do eksportu (aby nie zastąpić oryginalnego pliku pdf), unikniesz tego błędu.
Freedom_Ben
1

Przeglądarka PDF Okular ma to wbudowane z adnotacjami. Otwórz plik PDF, który chcesz podpisać, wybierz recenzje na pasku po lewej stronie, wybierz trzecią opcję w menu podręcznym z napisem „linia odręczna”. Wyciągnij swój podpis. Jeśli chcesz czarny atrament, a nie zielony neon, wybierz z menu „Ustawienia”, wybierz „Konfiguruj Okulara” i przycisk „Adnotacje” po lewej stronie. Wybierz opcję „Linia odręczna” z opcji, a następnie przycisk „Edytuj”. Tutaj możesz dostosować zarówno grubość, jak i kolor linii. Kliknij Zastosuj i ciesz się.

chrześcijanin
źródło
0

updf jest do tego naprawdę dobry. Po skorzystaniu z podglądu w systemie MacOS do „podpisywania” dokumentów, updf zapewnia użytkownikom jak najlepsze wrażenia.

Poniższe działa na Ubuntu 14.10 i Debian 8.

Nie chciałem dodawać ppa innej firmy do mojego systemu, więc zamiast tego uruchomiłem aktualizację w następujący sposób:

$ bzr branch lp:updf

następnie dokonał edycji 2-wierszowej zgodnie z drugą odpowiedzią.

Zainstaluj zależności:

# 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

(powyższe było wystarczające; jednak nie każde opakowanie może być konieczne).

a następnie program python można uruchomić w miejscu:

$ ./src/updf.py

Niestety jakość dokumentu wyjściowego może ulec poważnemu pogorszeniu w porównaniu do dokumentu wejściowego. Właściwym sposobem na to byłoby nałożenie podpisu, a nie zmiana oryginału, w bezstratnym procesie. Wydaje się, że updf angażuje się w ponowne kodowanie oryginału.

projix
źródło
Musiałem dodać python-gi-cairodo zależności, aby działało.
Joma
Joma: dzięki; Dodałem teraz do listy python-gi-cairo.
projix
0

Prowadzę firmę i Xournal nie ma jakości ani kontroli nad plikami pdf, których potrzebuję.

Cały czas używam lub stosuję podpisy cyfrowe.

Master PDF Editor (wersja 5 od tej daty) to płatna aplikacja, która z łatwością przekracza oczekiwania i jest teraz moim domyślnym czytnikiem pdf dla Ubuntu. Kluczowa cecha: - podpisywanie dokumentów - wypełnianie formularzy - modyfikowanie tekstu i obiektów - dodawanie adnotacji i wyróżnianie dokumentów - scalanie i dzielenie plików pdf - itp

Aby uzyskać więcej informacji, przejdź do: https://code-industry.net/masterpdfeditor/?-about&ver=5438

Brad Horn
źródło