Wygenerować lub zaktualizować plik PDF, aby zawierał zaszyfrowany, ukryty znak wodny?

10

tło

Korzystanie z LaTeX do napisania książki. Gdy użytkownik kupi książkę, plik PDF zostanie wygenerowany automatycznie.

Problem

Plik PDF powinien mieć znak wodny zawierający imię i nazwisko oraz dane kontaktowe.

Pytanie

Jakie oprogramowanie spełnia następujące kryteria:

  • Stosuje zaszyfrowane, niewidoczne znaki wodne do pliku PDF
  • Otwarte źródło
  • Niezależny od platformy (Linux, Windows)
  • Szybki (oznacza 200 stron PDF w mniej niż 1 sekundę)
  • Przetwarzanie wsadowe (wyłącznie z poziomu wiersza poleceń)
  • Odporny na zmowy
  • Nietrwały (np. PDF -> EPS -> PDF nadal zawiera znak wodny)
  • Dobrze udokumentowane (pokazuje przykładowe zastosowania)

Pomysły i zasoby

Kilka przemyśleń i ustaleń:

Problem z NLP polega na tym, że można wprowadzić błędy gramatyczne. Problem ze steganografią polega na tym, że obrazy pochodzą z pamięci podręcznej obrazów, a więc odtworzenie tej pamięci podręcznej ze zdjęciami ze znakiem wodnym spowoduje opóźnienie podczas generowania pliku PDF (mógłbym po prostu usunąć jeden obraz z pamięci podręcznej, ale to nie jest eleganckie rozwiązanie).

Dziękuję Ci!

Dave Jarvis
źródło
Zmodyfikuj nieco opis wymagań, w przeciwnym razie będą niejasne. „niewykrywalne znaki wodne” najwyraźniej nie są tym, czego chcesz ... w przeciwnym razie, jak sam byś je wykrył, gdybyś musiał?
Kurt Pfeifle,
Nie jest do końca jasne, jaki jest dokładnie cel twojego wymyślonego systemu: wykryć, czy plik PDF jest przekazywany innemu użytkownikowi, nawet jeśli twoja licencja tego zabrania? Wykryć, czy plik PDF jest wydrukowany na papierze, nawet jeśli licencja tego zabrania? Śledzić drogę konkretnego pliku PDF przez Internet i śledzić, kiedy jest otwierany? Albo coś innego?
Kurt Pfeifle,
@pipitas: Jeśli zarejestrowana wersja pliku PDF zostanie wydana bez zezwolenia na wolności, chciałbym wiedzieć, kto ją wydał. Ale jeśli ludzie zobaczą, że plik PDF ma znak wodny, to znak wodny staje się o wiele łatwiejszy do obejścia.
Dave Jarvis

Odpowiedzi:

6

Zrobiłem coś podobnego kilka lat temu. Nie spełniał wszystkich twoich „twardych” kryteriów. Działa to tak:

  • Umieściłem ledwo wykrywalny obszar „klikalny” o rozmiarze 2x2 punktu w jakimś losowym miejscu na jednym z marginesów losowej strony PDF. Jest mało prawdopodobne, że zostanie on wykryty przypadkowo (pośród innych bardzo oczywistych klikalnych punktów dostępowych, które i tak były w pliku PDF ...).

  • Kliknięcie linku spowoduje przejście do strony internetowej http://my.own.site/project/87245e386722ad77b4212dbec4f0e912z kilkoma wymyślonymi punktami „errata”. (Czy wspomniałem, że 87245e386722ad77b4212dbec4f0e912to skrót MD5 imienia osoby + dane kontaktowe, które trzymałem przechowywane w tabeli DB? :-)

Oczywiście nie chroni to przed drukowaniem + skanowaniem + ocrcingiem ani przed cyklem „ponownego próbowania” plików PDF. I opiera się również na pewnym stopniu „bezpieczeństwa przez zaciemnienie”.

Oto jak używasz Ghostscript, aby dodać taki klikalny punkt aktywny w lewym dolnym rogu strony 1 pliku random-in.pdf:

gs \
 -o random-out.pdf \
 -sDEVICE=pdfwrite \
 -dPDFSETTINGS=/prepress \
 -c "[ /Rect [1 1 3 3]" \
 -c "  /Color [1 1 1]" \
 -c "  /Page 1" \
 -c "  /Action <</Subtype /URI" \
 -c "  /URI (http://my.own.site/87245e386722ad77b4212dbec4f0e912)>>" \
 -c "  /Subtype /Link" \
 -c "  /ANN pdfmark" \
 -f random-in.pdf

Aby powiększyć obszar, który można kliknąć, zmień widoczną powyżej parametrów wiersza polecenia:

 [....]
 -c "[/Rect [1 1 50 50]" \
 -c "  /Color [1 0 0]" \
 [....]

Jeszcze prostsze byłoby wygenerowanie i zachowanie skrótu MD5 pliku PDF w bazie danych. Będzie unikalny dla każdego tworzonego pliku PDF, ponieważ dokumenty UUID oraz CreationDate i ModDate wewnątrz jego metadanych. Oczywiście pozwala to również śledzić oryginalne pliki PDF w formie cyfrowej ...

Kurt Pfeifle
źródło
Czy kiedykolwiek znalazłeś plik PDF na wolności i prześledziłeś go przy użyciu tej techniki?
Dave Jarvis
@Dave Jarvis: Tak, w pewnym sensie… Ale to nie była „poważna” rzecz, nie miałem żadnego zainteresowania śledzeniem. Zrobiłem to tylko jako dowód koncepcji i po około 6 miesiącach wyłączyłem serwer WWW „śledzący”. To był sieciowy serwer PDF, który skonfigurowałem w firmie klienta. „Moduł śledzący” był podobny do opisanego powyżej, ale używał klikalnego obszaru na całej stronie. Właśnie śledziłem liczbę „trafień” w pliku dziennika apache ....
Kurt Pfeifle
Fajny pomysł, ale zauważ, że uruchomienie GhostScript na takim pliku PDF może obniżyć wszystkie zawarte w nim obrazy próbkowane, ponieważ GhostScript nie obsługuje ich nieekompresowania (co powoduje utratę informacji z obrazów skompresowanych w formacie JPEG na wejściu) i ma tendencję do zastosuj kompresję w stylu JPEG do wszystkich zdjęć (nawet tych właśnie zdekompresowanych) ...
SamB
@SamB: Myślę , że możesz dodać -dJPEQ=100 -dQFActor=1.0do wiersza poleceń Ghostscript, aby upewnić się, że utrzymasz 100% istniejącej jakości JPEG. Ale nie, nie zauważyłem żadnego pogorszenia jakości obrazu w moich plikach, jeśli użyłem ogólnego ustawienia -dPDFSETTINGS=/prepresspodczas ponownej destylacji plików PDF za pomocą Ghostscript ....
Kurt Pfeifle
[ciąg dalszy] I nie, nie tylko kompresja JPEG jest oferowana dla obrazów z Ghostscript - możesz użyć -dColorImageFilter=/FlateEncode(czyli bezstratnego ZIP), aby zastąpić domyślny =/DCTEncode(którym jest stratny JPEG) w starszych wersjach GS. Od wersji GS 7.21 i =/FlateEncodetak jest to ustawienie domyślne ... Tak samo jak w przypadku koloru, jest to prawda -dGrayImageFilter=...( -dMonoImageFilter=...używa /CCITTFaxEncodedomyślnie).
Kurt Pfeifle
1

Bardzo trudny i nie jestem pewien, czy to w ogóle odpowie na wszystkie pytania.

Nie jestem pewien, czy istnieje rozwiązanie typu „wszystko w jednym”, które może to zrobić lub losowo.

Gdybym jednak miał to za zadanie, pomyślałbym, że najłatwiej jest zachować dokument w formacie pośrednim, takim jak sformatowany HTML lub podobny.

Korzystając z drukowanego pliku CSS lub podobnego, możesz uzyskać układ identyczny z książką i użyć jakiegoś skryptu, aby losowo zobrazować obraz, treść lub cokolwiek, oraz komponent PDF po stronie serwera, który ponownie składa dokument.

tak więc - na przykład po zakupie dokumentu, skrypt kupujący może losowo wybrać liczbę identyfikującą mechanizm ochrony (np. pierwsze zdjęcie, drugie zdjęcie, gdzieś tekst itp.), a następnie wygenerować unikalny link do pobrania.

Po wywołaniu tego łącza pobierania sprawdza numer, wykonuje operację i kompiluje do pliku pdf, a następnie pobiera go do klienta.

Znów wiem, że nie będzie to łatwe / proste, ale nie prosisz o coś łatwego i jest to najlepszy sposób, jaki mogę wymyślić.

William Hilsum
źródło
@Dave Jarvis - W pełni rozumiem, co próbujesz zrobić ... jak powiedziałem, nie jestem pewien najlepszego rozwiązania, ale to, co powiedziałem, powinno przynajmniej zadziałać ... po prostu daleki od łatwego.
William Hilsum,
@Dave Jarvis - Próbowałem powiedzieć / przejść przez to, że nigdy nie widziałem w jednym / łatwym sposobie robienia tego, co chcesz, ale używając PHP / ASP.Net, łatwiej jest pisać skrypty / dzwonić do osób trzecich składniki. Myślę, że jeśli masz cały dokument w formacie HTML poprawnie sformatowany / dokładnie, bardzo łatwo byłoby użyć komponentu PDF do konwersji .... Załóżmy na przykład, że na stronie 31 jest 100 stron i obraz może mieć strony 1-30 w formacie PDF i strony 32-100 w formacie PDF, strona 31 zostanie wygenerowana i sformatowana w formacie HTML (zgodnie ze stylem reszty książki), a następnie można użyć 1/2
William Hilsum
Komponent pdf, który pobierze pierwszy plik PDF, ukryje stronę HTML, zdobędzie drugi plik PDF i wygeneruje nowy plik PDF, który połączy go wszystkie. Wygenerowana strona może wywoływać skrypty, może wykonywać steganografię (nie jestem pewien na czasowniku!) Lub cokolwiek innego, czego chcesz ... istnieje wiele (darmowych i płatnych) składników pdf - jest to na przykład ... componentone.com/SuperProducts / PDF Mam nadzieję, że dzięki temu nieco bardziej zrozumiałe jest to, co próbuję przekazać - po prostu bardzo trudne do wyjaśnienia. 2/2
William Hilsum,
@Dave Jarvis - ehh, niezupełnie ... Tak jak powiedziałem, bardzo trudno to wytłumaczyć ... Niektóre składniki PDF są niesamowite wraz ze stylami CSS / drukowania. Na przykład spójrz na Moodle. Możliwe jest pełne sformatowanie strony internetowej i nadanie wydrukowi wyglądu książki / stylu. Następnie możesz użyć komponentu PDF, aby eksportować / zapisywać DOKŁADNIE tak, jak powinien wyglądać wynik końcowy. Możesz łatwo wygenerować obraz, którego potrzebujesz i mieć tekst, i złożyć go (płynnie dla użytkownika końcowego) jako pojedynczy plik PDF. Wspominam o web / php / asp.net, ponieważ uważam, że jest to najłatwiejszy sposób na dotarcie do tego, co chcesz.
William Hilsum,
@Dave Jarvis: Chyba nie używasz pdfTeX? (Czy byłeś bardziej zaniepokojony tym, że użytkownicy wykonują konwersję pdf-> ps-> pdf i degradują przykładowe obrazy w tym procesie?). W każdym razie, PS> konwersja pdf robi zazwyczaj pogorszyć obrazów, ponieważ GhostScriptowi nie jest wystarczająco inteligentny, aby zachować obrazy JPEG stylu w postaci skompresowanej, i ma tendencję do automatycznego zastosowania kompresji JPEG stylu do jakichkolwiek obrazów występujących na wejściu. (Najwyraźniej można go poinstruować, aby zostawił zdjęcia w stylu JPEG w spokoju, ale czy ktoś tak naprawdę je ma?)
SamB