Jak przeglądać i edytować kod pliku PDF

12

Zastanawiałem się, jak wyświetlić i edytować kod pliku PDF?

  1. Przeglądając, nie chcę widzieć formatu binarnego, więc myślę, że hexdumpmoże nie być tym, czego chcę. Próbowałem gedit, ale nie można użyć metody kodowania do dekodowania treści PDF.

  2. Poprzez edycję chciałbym je wyszukać /Fiti zmienić na /XYZ, na przykład, sed. Ale moje polecenie sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfwydaje się nie zmieniać wyglądu mojego pliku PDF, jak się spodziewałem, chociaż nie zgłasza żadnego błędu. Zastanawiałem się, czy sedrzeczywiście mogę pracować na plikach PDF tak, jakby były zwykłym tekstem?

Kontekst moich pytań można znaleźć w tym pytaniu . Mój system operacyjny to Ubuntu 10.10.

Tim
źródło

Odpowiedzi:

9

Możesz używać sedz plikami binarnymi (przynajmniej GNU sed; niektóre implementacje mogą mieć problemy z plikami zawierającymi znaki puste lub nie kończącymi się znakiem nowej linii). Ale użyte polecenie zastępuje tylko pierwsze wystąpienie /Fitkażdej linii, a linie w pliku PDF są prawie bez znaczenia. Musisz zastąpić wszystkie wystąpienia:

 sed s/\/Fit/\/XYZ/g

Bardziej niezawodne byłoby zastąpienie tylko /Fitwtedy, gdy po nim nie pojawiłby się składnik słowa (np. Nie zastąpienie /Fitness; nie wiem, czy twój plik zawiera takie zdarzenia /Fit, które spowodowałyby problemy). Oto jeden ze sposobów:

perl -pe 's!/Fit\b!/XYZ!g'
Gilles „SO- przestań być zły”
źródło
Dzięki! Teraz działa! (1) Zastanawiałem się, jak sed szuka znaków w treści binarnej? Czy sed najpierw koduje znaki zapytania przed wyszukiwaniem? (2) W ostatnim poleceniu, co robi !, \bi gmyśli? Czy można to zrobić bez perla tylko za pomocą sed?
Tim
1
@Tim (1) Sed ładuje dane do pamięci, obsługuje je i drukuje. Dlaczego miałby coś kodować? (2) goznacza zastąpienie wszystkich wystąpień w każdej linii, zarówno sed, jak i perl. !jest separatorem; możesz wybrać (prawie) dowolny znak jako separator spolecenia (dotyczy to zarówno sed, jak i perla). \boznacza granicę słowa; istnieje w perlu, ale nie w sed.
Gilles „SO- przestań być zły”
Około (1), ponieważ znaki, które podajesz sed w poleceniu, są czytelne dla ludzi. Jeśli treść do wyszukiwania jest całkowicie binarna, w jaki sposób sed może znaleźć tam słowo zapytania?
Tim
@Tim Text to dane binarne, które mogą być czytelne dla człowieka.
Gilles „SO- przestań być zły”
1
@Tim Tak, możesz przekazać dane binarne w zapytaniu. Będziesz musiał wstawić znaki dosłownie w kodzie źródłowym sed lub shell.
Gilles „SO- przestań być zły”
17

Odnośnie twojego pierwszego pytania („przeglądanie kodu źródłowego, ale bez plików binarnych”): istnieje kilka opcji, które masz do dekompresji wewnętrznych strumieni binarnych, które są dołączone do wielu obiektów.

Moim ulubionym narzędziem do tego jest QPDF , dostępny na wszystkich głównych platformach systemu operacyjnego. Następujące polecenie dekompresuje wszystkie strumienie i wszystkie strumienie obiektów:

 qpdf --qdf --object-streams=disable orig.pdf expanded.pdf

Teraz możesz otworzyć plik PDF w dowolnym edytorze tekstu. (Wciąż mogą tam być binarne obiekty BLOB: na przykład pliki czcionek i profile ICC, co nie ma sensu, aby QPDF się rozwijał).

Do ponownej kompresjiexpanded.pdf ponownie po edycji, można uruchomić:

 qpdf expanded.pdf orig2.pdf

(Ostrożnie przy ręcznej edycji plików PDF! Aby dobrze to zrobić, musisz wiedzieć dużo o ich wewnętrznej składni. Gdy tylko dodasz lub usuniesz pojedynczy bajt, możesz otrzymać komunikaty o błędach od czytników plików PDF, które mogą już nie być w stanie otworzyć, ponieważ PDF wewnętrzny ToC jest uszkodzony, która opiera się na obliczeniach bajtowych offsetu. Wystarczy zastąpienie Fitprzez XYZciągi powinny iść grzywny, chociaż ...)

Kurt Pfeifle
źródło
1
Możesz także dodawać lub usuwać tekst. Gdy długość strumienia obiektu zmienia się, przesunięcia bajtów można ponownie obliczyć za pomocą fix-qdfprogramu, który jest częścią qpdf. Jednak nadal musisz być nieco ostrożny. Zobacz qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H. Rittich
@ H.Rittich: Dzięki za komentarz ... Jak myślisz, w jaki sposób otwiera to nowe spojrzenie na problem? Czy uważasz, że nie wiemy, że możemy w ten sposób dodawać lub usuwać tekst?
Kurt Pfeifle
@KursPfeifle: Nie przyjmuję żadnych założeń na temat tego, co wiesz. Odpowiedź stwierdza, że ​​edycja pliku PDF w ten sposób musi zachować przesunięcia bajtów obiektów w pliku. Można jednak zmienić przesunięcia bajtów podczas późniejszej korekty przy użyciu fix-qdf. Dlatego jeśli chcesz zastąpić ciąg przez ciąg o różnej długości, jest to możliwe, ale musisz użyć fix-qdfnarzędzia. Powiedziałbym, że jest to użyteczny dodatek do odpowiedzi.
H. Rittich,
@ H.Rittich: Dzięki za przedstawienie swojej perspektywy. Kiedy podkreślił potrzebę zachowania bajtów przesunięcia obiektów nie chcą porad ludzi o JAK powinni to zrobić. Gdybyś sformułował swój komentarz nieco inaczej, szybciej zrozumiałbym jego intencję.
Kurt Pfeifle,
1

sedjest zorientowany na linie, co czyni go nieodpowiednim dla plików binarnych, które mają strukturę bloków, a nie linii.
Spróbuj zamiast tego użyć bbe (bbe-.sourceforge.net).

Alternatywnie, zarówno Emacs (GNU i XEmacs), jak i vim płynnie otwierają pliki PDF. Oczywiście nie jest zbyt ładnie drukowany, ponieważ zawiera mieszany tekst i pliki binarne, ale wystarcza do edycji.
Istnieje plugin Pdftk dla vima, który ułatwia wszystko, pobierz tutaj (plik zip).
Jak zapewne wiesz, oba powyższe edytory mają potężne funkcje wyszukiwania i zamiany.

Ponadto konwersja pliku PDF do trybu QDF przed bardzo ułatwia edycję plików PDF.

Philomath
źródło
Możesz także spróbować edytować za sedpomocą -bprzełącznika. jeśli to zadziała, dodam to do mojej odpowiedzi.
Philomath
@Tim: co rozumiesz przez „nic nie pokazuje”, po prostu pusty? jakiś komunikat o błędzie? Czy możesz także wypróbować XEmacs? (wszystkie trzy działały dla mnie).
Philomath
Nieważne -b, jest specyficzny dla cygwina.
Philomath
Emacs mówi: „Plik 1.pdf jest duży (9 MB), naprawdę otwarty? (Y czy n)”. Wybrałem „y”, a potem już nic nie ma.
Tim
Najprawdopodobniej problem z Emacsem, czy masz XEmacsa? (Właśnie otworzyłem plik 31 MB PDF bez żadnych problemów).
Philomath
0

Użyj LibreOffice lub OpenOffice, aby otworzyć plik PDF, wyświetlić go, zamienić, napisać nowy plik PDF itp. Myślę, że możesz go używać nawet z wiersza poleceń lub programowo, jeśli jest wiele dokumentów do przetworzenia.

Zauważ, że pliki PDF z niektórych źródeł, np. Skanerów, często zawierają strony jako obrazy, a nie jako tekst, więc nie będziesz miał szczęścia, jeśli użyjesz wyszukiwania i zamień.

Steve Barnes
źródło
3
(1/2) Należy pamiętać o następującym fakcie: LibreOffice nie jest natywnym edytorem PDF. Po otwarciu pliku PDF konwertuje wszystkie strony na obraz wektorowy (który może zachować części rastrowe z oryginalnego pliku PDF jako części rastrowe) i otwiera go w części LibreOffice Draw pakietu LibreOffice. Następnie, po zapisaniu edytowanego pliku PDF, będzie to plik PDF wyeksportowany z natywnego formatu LibreOffice Draw (z przyrostkiem .odg ) do pliku PDF.
Kurt Pfeifle
3
(2/2) Ten przepływ pracy może mieć nieoczekiwane skutki uboczne. Ponadto aplikacja LibreOffice Draw może nie być w stanie poprawnie zaimportować wszystkich elementów z oryginalnego pliku PDF. Jednak w wielu przypadkach nadal może być użytecznym narzędziem dla tych wszystkich ludzi, którzy nie mają lepszych dostępnych środków.
Kurt Pfeifle