Jak mogę zainstalować pdftk w Ubuntu 18.04 i nowszych?


105

Czy jest jakaś szansa na pdftkpracę w Ubuntu 18.04? Potrzebuję tego do tworzenia plików PDF ze znakiem wodnym w powłoce.

A może ktoś zna działającą alternatywę pdftkdo generowania pliku PDF ze znakiem wodnym w powłoce?

Już je sprawdziłem / wypróbowałem:

sudo apt list pdf*
Listing... Done
pdf-presenter-console/bionic 4.1-2 amd64
pdf-redact-tools/bionic,bionic 0.1.2-1 all
pdf.js-common/bionic,bionic 1.5.188+dfsg-1 all
pdf2djvu/bionic 0.9.8-0ubuntu1 amd64
pdf2svg/bionic 0.2.3-1 amd64
pdfcrack/bionic 0.16-1 amd64
pdfcube/bionic 0.0.5-2build6 amd64
pdfcube-dbg/bionic 0.0.5-2build6 amd64
pdfgrep/bionic 2.0.1-1 amd64
pdfminer-data/bionic,bionic 20140328+dfsg-1 all
pdfmod/bionic,bionic 0.9.1-8 all
pdfmod-dbg/bionic,bionic 0.9.1-8 all
pdfposter/bionic,bionic 0.6.0-2 all
pdfresurrect/bionic 0.14-1 amd64
pdfsam/bionic,bionic 3.3.5-1 all
pdfsandwich/bionic 0.1.6-1 amd64
pdfshuffler/bionic,bionic 0.6.0-8 all
pdftoipe/bionic 1:7.2.7-1build1 amd64

Ale nie znalazłem działającego narzędzia.


3
i łańcuch PDF też! Te dwa narzędzia były dla mnie bezcenne!
Joshp.23

3
Nie pisz po prostu „Możesz spróbować ...”, wyjaśnij, jak to robisz i jakie kroki musisz wykonać, aby odpowiedź była bardziej pomocna
ADDB

1
Jeśli sam rozwiązałeś problem, odpowiedz na swoje pytanie i zaakceptuj odpowiedź. Nie umieszczaj odpowiedzi w swoim pytaniu lub komentarzach! :-) Pozwoliłem sobie cofnąć zmianę, która dodała odpowiedź, ale zawsze możesz przejrzeć historię wpisu za pomocą linku poniżej.
David Foerster

5
Do Twojej wiadomości, pdftk został usunięty z repozytoriów i pojawia się prośba o dodanie go z powrotem.
David Foerster

2
szkoda, że ​​tak fajne narzędzie zostało usunięte tylko dlatego, że programiści nie znaleźli akceptowalnego rozwiązania
Daniel Alder

Odpowiedzi:


92

Pakiet pdftk Ubuntu (i jego górnego pakietu Debiana ) zostało usunięte ze względu na zależność od już nieaktualnych gcj wykonywania. Zamiast tego znalazłem widelec, który zależy od OpenJDK lub podobnego.

Zainstaluj z przyszłej wersji Ubuntu (zalecane)

Począwszy od Cosmic (Ubuntu 18.10), Ubuntu jest wysyłane pdftk-javaz tego samego kodu źródłowego jak poniżej. Próba instalacji pdftkspowoduje zainstalowanie tego pakietu. Użytkownicy wcześniejszych wersji mogą pobrać go ręcznie z repozytorium pakietów i zainstalować przy użyciu swojego ulubionego menedżera pakietów.

Zainstaluj z PPA (nieaktualne)

Zbudowałem pakiet Deb (tylko dla Bionic) z odpowiednimi zależnościami:

sudo add-apt-repository ppa:malteworld/ppa
sudo apt update
sudo apt install pdftk

Pakiet zawiera umieszczony skrypt otoki /usr/bin, dzięki czemu można go wywoływać normalnie:

pdftk <arguments> ...

Zainstaluj ze źródła

  1. Zainstaluj narzędzia kompilacji i zależności:

    sudo apt install git default-jdk-headless ant \
        libcommons-lang3-java libbcprov-java
    

    Oczywiście możesz użyć innego obsługiwanego JDK niż ten dostarczony przez default-jdk-headless.

  2. Pobierz widelec pdftk Marc Vinyal :

    git clone https://gitlab.com/pdftk-java/pdftk.git
    cd pdftk
    
  3. Umieść dowiązania symboliczne do wymaganych bibliotek w libfolderze:

    mkdir lib
    ln -st lib /usr/share/java/{commons-lang3,bcprov}.jar
    
  4. Zbuduj pakiet JAR:

    ant jar
    
  5. Uruchom pakiet JAR:

    java -jar build/jar/pdftk.jar --help
    
  6. (Opcjonalnie) Aby uruchomić pakiet JAR, np. Podczas dystrybucji do innych systemów, potrzebujesz przynajmniej działającego (bezgłowego) środowiska JRE, takiego jak z default-jre-headlesspakietu, a także bibliotek Java libcommons-lang3-javai libbcprov-java:

    sudo apt install default-jre-headless libcommons-lang3-java libbcprov-java
    

    Ponownie możesz użyć innego środowiska JRE niż default-jre-headless. Ten widelec pdftk obsługuje również kompilacje dla starszych wersji JRE (≥ 7 zgodnie z dokumentacją).

  7. (Opcjonalnie) Możesz nauczyć Linuksa wykonywania plików JAR (Java Archive) za pośrednictwem update-binfmts(8). Większość środowisk JRE dostarczanych w pakietach Deb, w tym w repozytoriach pakietów Canonical, zajmuje się tym podczas instalacji, choć wydaje się, że w niektórych pakietach OpenJDK jest wadliwa.

PS: Próbowałem tego z bezgłowym OpenJDK 9 w Ubuntu Trusty, ale widzę niewiele powodów, dla których nie powinien on działać z bezgłowym OpenJDK 10 w Bionic.

W zależności od zastosowania

Komentator podniósł prawidłowe pytanie, czy zmiana ta ma wpływ na zależne aplikacje Łańcucha PDF :

  • Nie , PDF Chain to aplikacja w C ++ i nie jest bezpośrednio dotknięta wycofaniem GCJ. Potrzebuje działającego pliku wykonywalnego pdftk, ale nie obchodzi go, jak działa pod maską. W każdym razie łańcuch PDF został usunięty z Bionic oraz pdftk .

Czytałem kolejne pytanie dotyczące instalowania innego pakietu, który został usunięty z repozytoriów na 18.04, i jeden użytkownik zasugerował zainstalowanie pakietu .deb przy użyciu gdebi, który powinien obsługiwać zależności. Czy uważasz, że to zadziałałoby, czy stworzyłoby jakieś problemy? To może być głupie pytanie - staram się tylko zrozumieć więcej na temat zarządzania pakietami.
Hee Jin,

5
Oba zestawy instrukcji w tej odpowiedzi instalują pdftk-javawidelec Marc Vinyal . Będzie to (najprawdopodobniej) oficjalny zamiennik dla pdftkDebiana ( patrz ) i Ubuntu (z pakietem dostępnym dla 18.10). Tak więc wydaje się to najlepsza odpowiedź , ponieważ jest to „dowód na przyszłość”: od 18.10 będziesz otrzymywać to samo oprogramowanie w oficjalnych repozytoriach.
tanius

@DavidFoerster Na to. Pytanie: Czy istnieje jakiś szczególny powód, aby polecać antbiblioteki instalowane przez apt zamiast używania Gradle do kompilacji?
Raphael

W kolejnym pytaniu dotyczącym wspomnianych pakietów fikcyjnych pojawiły się wątpliwości, czy zależności pdftk-javasą dobrze wybrane. Możesz to sprawdzić.
Raphael

Stworzyłem opisy pakietów dla urządzeń equiv, które udostępniają Javę zainstalowaną przez SDKMAN! jako pakiet, który spełnia zależności pdftk-java.
Raphael

61

W przypadku Ubuntu 18.04 wystarczy zainstalować pakiet przystawki pdftk:

sudo snap install pdftk

1
Symlinkowanie nie działało dla mnie, ponieważ snapwydaje się, że potrzebuje nazwy skryptu. Ale minimalny skrypt otoki /snap/bin/pdftk-smoser.pdftk "$@"działa równie dobrze.
Boldewyn

Jaka wersja Ubuntu? Dokładne instrukcje, które podałem powyżej, działały dla mnie. Wywołuję pdftk z niektórych skryptów przetwarzających perl xml, a testem kwasowym jest działanie skryptów i tworzenie połączonych plików pdf.
pgoetz

3
Zaktualizowałem powyższą odpowiedź, aby użyć tylko „pdftk” zamiast „pdftk”, ponieważ ja (smoser) przesłałem do sklepu przystawkę o nazwie „pdftk” o tej samej treści. ( snapcraft.io/pdftk )
smoser

4
Wyglądało na to, że instalacja przebiegła poprawnie, ale wtedy pdftk nie otwierał się ani nie działał na żadnych plikach (zawsze mówi „Błąd: Nie można znaleźć pliku. Błąd: Nie można otworzyć pliku PDF:”), również nie ma strony man. Na koniec usunąłem go za pomocą snap remove i poszedłem z rozwiązaniem @abu_bua powyżej, które działa idealnie.
scoobydoo

1
Ze względu na punkty przyciągania, przyciąganie nie może uzyskać dostępu do wszystkich plików. Niektóre informacje na ten temat są dostępne na stronie github.com/smoser/pdftk/issues/1 . Najłatwiejszym rozwiązaniem jest umieszczenie plików w katalogu domowym.
smoser

36

Instalowanie pdftk na Ubuntu 18.04 amd64

Napisałem mały skrypt bash, który automatyzuje instalację na Ubuntu 18.04. Pamiętaj, że pobrałem tylko pakiety amd64 !

#!/bin/bash
#
# author: abu
# date:   July 3 2019 (ver. 1.1)
# description: bash script to install pdftk on Ubuntu 18.04 for amd64 machines
##############################################################################
#
# change to /tmp directory
cd /tmp
# download packages
wget http://launchpadlibrarian.net/340410966/libgcj17_6.4.0-8ubuntu1_amd64.deb \
 http://launchpadlibrarian.net/337429932/libgcj-common_6.4-3ubuntu1_all.deb \
 https://launchpad.net/ubuntu/+source/pdftk/2.02-4build1/+build/10581759/+files/pdftk_2.02-4build1_amd64.deb \
 https://launchpad.net/ubuntu/+source/pdftk/2.02-4build1/+build/10581759/+files/pdftk-dbg_2.02-4build1_amd64.deb


echo -e "Packages for pdftk downloaded\n\n"
# install packages 
echo -e "\n\n Installing pdftk: \n\n"
sudo apt-get install ./libgcj17_6.4.0-8ubuntu1_amd64.deb \
    ./libgcj-common_6.4-3ubuntu1_all.deb \
    ./pdftk_2.02-4build1_amd64.deb \
    ./pdftk-dbg_2.02-4build1_amd64.deb
echo -e "\n\n pdftk installed\n"
echo -e "   try it in shell with: > pdftk \n"
# delete deb files in /tmp directory
rm ./libgcj17_6.4.0-8ubuntu1_amd64.deb
rm ./libgcj-common_6.4-3ubuntu1_all.deb
rm ./pdftk_2.02-4build1_amd64.deb
rm ./pdftk-dbg_2.02-4build1_amd64.deb

Ten skrypt pobierze pakiety /tmpi zainstaluje stamtąd za pomocą apt installpolecenia! Następnie pakiety w /tmpkatalogu zostaną usunięte.

Aby uruchomić ten skrypt, skopiuj go do edytora i zapisz np . Pdftk_installer . Następnie uruchom go w terminalu za pomocą

chmod 755 pdftk_installer
./pdftk_installer

wygląda na pdftk-dbg_2.02-4build1_amd64.debto, że jest opcjonalne
Jossef Harush,

Jest to o wiele lepsze niż wersja snap lub wersja java z PPA - dzięki!
simon

Aby to wyjaśnić, wygląda na to, że pobiera pakiety Ubuntu-artful (17.10).
Randall Whitman,

3
Wszystkie linki są zepsute
programista

1
linki zaktualizowane teraz!
abu_bua

10

Możesz spróbować użyć obrazu dokera Ubuntu 16.04 z zainstalowanym programem pdftk, aby uruchomić program pdftk:

  1. Zainstaluj dokera:

    sudo apt install docker.io
  2. Pobierz Ubuntu 16.04 i uruchom powłokę bash:

    sudo docker run -it ubuntu:16.04 bash
  3. Zaktualizuj i zainstaluj pdftk z wiersza polecenia:

    apt update
    apt install pdftk
  4. W nowym uruchomieniu terminala:

    sudo docker ps -a
  5. Zatwierdź obraz, używając ID KONTENERA ubuntu: 16.04, do nowego obrazu z zainstalowanym pdftk:

    sudo docker commit CONTAINER_ID ubuntu_pdftk

    (Zamień na CONTAINER_IDswój identyfikator kontenera.)

  6. Utwórz plik o nazwie pdftkin, /usr/bina następnie wykonaj go przy użyciu chmod +x /usr/bin/pdftk:

    #!/bin/sh
    set -eu
    docker run --name pdftk -it -v "$PWD:/workdir$PWD" -w "/workdir$PWD" ubuntu_pdftk pdftk "$@"
    docker rm pdftk

Prawie dokładnie to, co zrobiłem. Tyle że nie popełniłeś błędu -v "$PWD:/workdir$PWD" -w "/workdir$PWD"?
Ondra Žižka

5

Byłem w stanie zainstalować pdftk z pomysłowych pakietów deb (17.10). Pobierz, a następnie zainstaluj w tej kolejności:

Najlepiej jest zainstalować gcc-6-basenajpierw, aby uniknąć błędu zależności, jeśli robisz to z cli.

To powinno wystarczyć ... na razie.


2

Zrobiłem szybkie i nieprzyzwoite obejście, aby uruchomić PDFTK pod Bionic.

lsb_release -a && pdftk --version
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04 LTS
Release:        18.04
Codename:       bionic

pdftk 2.02 a Handy Tool for Manipulating PDF Documents
Copyright (c) 2003-13 Steward and Lee, LLC - Please Visit: www.pdftk.com

Aktualizuję mój sources.listi dołączam następujące wiersze:

deb http://no.archive.ubuntu.com/ubuntu/ artful main restricted
deb http://no.archive.ubuntu.com/ubuntu/ artful-updates main restricted
deb http://no.archive.ubuntu.com/ubuntu/ artful universe
deb http://no.archive.ubuntu.com/ubuntu/ artful-updates universe
deb http://no.archive.ubuntu.com/ubuntu/ artful multiverse
deb http://no.archive.ubuntu.com/ubuntu/ artful-updates multiverse
deb http://no.archive.ubuntu.com/ubuntu/ artful-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu artful-security main restricted
deb http://security.ubuntu.com/ubuntu artful-security universe
deb http://security.ubuntu.com/ubuntu artful-security multiverse

Potem uruchamiam prosty

sudo apt update

aby zmiany zaczęły obowiązywać.

Następnie zainstaluj pdftk przez

sudo apt install pdftk

Następnie ponownie usuń źródła Artful z source.list i w ten sposób uruchomię PDFTK pod Bionic.

Źródło: https://christiandietze.de/pdftk-with-ubuntu-bionic-18-04/


5
Cześć Christian, czy mógłbyś zaktualizować swoją odpowiedź, aby zawierała twoje obejście? Wolimy, jeśli podasz tutaj istotne części odpowiedzi, a następnie podasz link w celach informacyjnych. Dzięki!
CalvT

1
Tak, zwłaszcza, że ​​witryna, do której linkujesz, wydaje się nie działać.
terdon

Cześć CalvT, obejście, którego używam, polega na dodaniu pełnych pakietów do apt, zainstalowaniu pdftk i ich usunięciu. A terdon moja strona nie została wyłączona w ciągu ostatnich 30 dni, więc nie wiem, dlaczego nie powinieneś uzyskać dostępu do strony.
WiKrIe

@WiKrIe Wystąpił problem z Twoją witryną. Mogę dotrzeć do podstawowego adresu URL, ale nie do strony, do której linkujesz. Wayback Machine również nie może. Pamięć podręczna Google nie ładuje jej, ale ładuje źródło . Gdzieś na tej stronie musi być problem. Właśnie dlatego terdon ♦ myślał, że twoja strona nie działa. Tak też zrobiłem, dopóki nie sprawdziłem. Mam nadzieję, że to pomaga.
Dɑvïd

1
-1 za sugestię mieszania repozytoriów przeznaczonych dla różnych wydań Ubuntu bez odpowiednich reguł priorytetów.
David Foerster,


1

Możesz uruchomić pdftk na Ubuntu 18.04 z dokerem. To ulepszony wariant odpowiedzi Ademira.

Zakładając, że potrzebujemy tylko komponentu cli pdftk i na komputerze jest zainstalowany doker. Po prostu umieść następujący skrypt gdzieś na $ PATH z nazwą pdftki ustawionym bitem wykonywalnym:

#!/bin/bash

# Build or use cached image and tag with "local/local/ubuntu_pdftk", suppress 
# output to maintain compatibility in case you are parsing the pdftk output.
# It will build the image if it's absent or use the cached one.
echo "FROM ubuntu:16.04
RUN apt-get update && \
    apt-get install -y pdftk && \
    rm -rf /var/lib/apt/lists/*" | docker build -t local/local/ubuntu_pdftk - 2>&1 > /dev/null

# Run the pdftk as current user
set -eu
docker run --name pdftk -it --user $(id -u):$(id -g) --rm -v "$PWD:/workdir$PWD" -w "/workdir$PWD" local/local/ubuntu_pdftk pdftk "$@"

Pierwsze uruchomienie zajmie około 2 minut, aby zbudować obraz, jeśli zbudowany obraz pozostanie na komputerze, kolejne uruchomienia będą szybsze. Możesz swobodnie wyczyścić obraz, zostanie on zbudowany, gdy będziesz go potrzebować następnym razem.


1

Linki do pobierania w skrypcie opublikowanym przez @abu_bua wydają się już nie działać (prawdopodobnie z powodu końca wsparcia dla 17.10?), Więc tutaj jest zmodyfikowana wersja tego samego skryptu, który używa odpowiednich pakietów z kompilacji 16.04. Wypróbowany i przetestowany na maszynie z 18.04.

#!/bin/bash
#
# author: abu
# date:   May 12 2018
# description: bash script to install pdftk on Ubuntu 18.04 for amd64 machines
##############################################################################
#
# change to /tmp directory
cd /tmp
# download packages
wget http://mirrors.edge.kernel.org/ubuntu/pool/main/g/gcc-5/libgcj16_5.4.0-6ubuntu1~16.04.10_amd64.deb \
    http://mirrors.edge.kernel.org/ubuntu/pool/main/g/gcc-defaults/libgcj-common_4.9.3-9ubuntu1_all.deb \
    http://mirrors.edge.kernel.org/ubuntu/pool/universe/p/pdftk/pdftk_2.02-4_amd64.deb \
    http://mirrors.edge.kernel.org/ubuntu/pool/universe/p/pdftk/pdftk-dbg_2.02-4_amd64.deb

echo -e "Packages for pdftk downloaded\n\n"
# install packages 
echo -e "\n\n Installing pdftk: \n\n"
sudo apt-get install ./libgcj16_5.4.0-6ubuntu1~16.04.10_amd64.deb \
    ./libgcj-common_4.9.3-9ubuntu1_all.deb \
    ./pdftk_2.02-4_amd64.deb \
    ./pdftk-dbg_2.02-4_amd64.deb
echo -e "\n\n pdftk installed\n"
echo -e "   try it in shell with: > pdftk \n"
# delete deb files in /tmp directory
rm ./libgcj16_5.4.0-6ubuntu1~16.04.10_amd64.deb
rm ./libgcj-common_4.9.3-9ubuntu1_all.deb
rm ./pdftk_2.02-4_amd64.deb
rm ./pdftk-dbg_2.02-4_amd64.deb

1

Podoba mi się odpowiedź dokera Ademir , ale ma typowe problemy z bezpieczeństwem i uprawnieniami, ponieważ doker musi działać jako root. Jeśli Ci to przeszkadza, spróbuj użyć Osobliwości . Musisz zbudować obraz jako root, ale każdy użytkownik może go uruchomić.

Oto Singularityplik, którego użyłem:

# Generate the Singularity container to run pdftk from Ubuntu 16.04.
Bootstrap: docker
From: ubuntu:16.04

%help
    pdftk was removed from Ubuntu 18.04, so this container packages up the old
    version.

%post
    apt-get update -qq
    apt-get install -qq pdftk

%runscript
    pdftk "$@"

Potem zbudowałem obraz.

sudo singularity build pdftk.simg Singularity

Gdy to zadziałało, zainstalowałem go w folderze na ścieżce wraz ze skryptem otoki, który ustawia folder domowy na bieżący katalog.

sudo mv pdftk.simg /usr/bin/
echo 'singularity run --home $PWD /usr/bin/pdftk.simg "$@"' > pdftk
sudo chown root:root pdftk
sudo chmod +x pdftk
sudo mv pdftk /usr/bin

A teraz mogę biegać pdftk.

$ pdftk --version

pdftk 2.02 a Handy Tool for Manipulating PDF Documents
Copyright (c) 2003-13 Steward and Lee, LLC - Please Visit: www.pdftk.com
This is free software; see the source code for copying conditions. There is
NO warranty, not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Jedyną wadą jest to, że jest to dość duży plik wykonywalny, ponieważ zawiera pełną dystrybucję Ubuntu 16.04. Możesz również mieć problemy, jeśli próbujesz manipulować plikami PDF, które nie znajdują się w bieżącym katalogu.

$ ls -lh /usr/bin/pdftk*
-rwxr-xr-x 1 root root  53 Jul 23 12:32 /usr/bin/pdftk
-rwxr-xr-x 1 root root 88M Jul 23 12:06 /usr/bin/pdftk.simg

0

Cóż za świetna okazja, aby użyć magii dokerów!

To, co zrobiłem, to użyć kontenera dokującego z systemem Ubuntu 16.04, zainstalować w nim pdftk i tam go uruchomić.

Oto dokładne kroki, jeśli chcesz zrobić to samo:

  1. Zainstaluj dokera, jeśli jeszcze go nie masz ( https://docs.docker.com/install/ )
  2. Utwórz katalog gdzieś o nazwie pdftk
  3. Utwórz katalog o nazwie dockerwewnątrz pdftkkatalogu
  4. Skopiuj ten plik Docker do pdftk/dockerkatalogu: https://github.com/gkotian/gautam_linux/blob/master/docker/pdftk/Dockerfile
  5. Skopiuj ten skrypt również do pdftk/dockerkatalogu: https://github.com/gkotian/gautam_linux/blob/master/scripts/dockershell
  6. Upewnij się, że dockershellskrypt jest wykonywalny
  7. Do pdftkkatalogu skopiuj wszystkie pliki pdf, z którymi chcesz pracować
  8. cd /path/to/pdftk
  9. Uruchom skrypt dockershell ze ścieżką pliku Docker: docker/dockershell docker/Dockerfile(zajmie to trochę czasu przy pierwszym uruchomieniu)

Teraz powinieneś zobaczyć monit w kontenerze dokera, z którego możesz uruchomić pdftk. Po exitzakończeniu wpisz, aby wyjść z kontenera i powrócić do komputera hosta. Wszelkie nowo wygenerowane pliki będą obecne w pdftkkatalogu (ale będą własnością root, więc w razie potrzeby konieczna może być zmiana właściciela).


0

W dniu 18.04 w WSL zrobiłem następujące

Pobierz zależności z (plików .deb):

wget http://hr.archive.ubuntu.com/ubuntu/pool/main/g/gcc-6/libgcj17_6.4.0-8ubuntu1_amd64.deb

wget http://mirrors.edge.kernel.org/ubuntu/pool/main/g/gcc-defaults/libgcj-common_6.4-3ubuntu1_all.deb

sudo apt install gcc-6-base

następnie zainstaluj powyższe zależności

sudo dpkg -i libgcj*

potem wziąłem .debz https://packages.debian.org/search?ke Keywords=pdftk

wget http://ftp.us.debian.org/debian/pool/main/p/pdftk/pdftk_2.02-4+b2_amd64.deb
sudo dpkg -i pdftk_2.02-4+b2_amd64.deb

1
Linki do libgcj i libgcj17 są zepsute.
HJLebbink

1
@HJLebbink Ubuntu przestaje być pomysłowy :( linki do bibliotek
Eduard Florinescu
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.