Как просмотреть и отредактировать код файла PDF

Рабочий проект для традиционной оболочки:

ttyid=$(readlink /proc/$$/fd/1)
\___/   \______/ \___/ |  |  |
  |         |      |   |  |  \- 0: stdin 
  |         |      |   |  |     1: stdout <- our interest
  |         |      |   |  |     2: stderr
  |         |      |   |  \- fd is, maybe, filedescriptor
  |         |      |   |
  |         |      |   \- $$ is the PID of the current process (shell,
  |         |      |      in our case)
  |         |      |
  |         |      \- you know, much runtime stuff is here
  |         |
  |         \- readlink extracts the symbolic link of /proc/$$/fd/1
  |            lrwx------ 1 stefan stefan 64 2011-03-18 09:11
  |            /proc/22159/fd/1 -> /dev/pts/4
  |
  \- /dev/tty3 for real shell, /dev/pts/3 for xterm

Теперь мы можем кошка экран в файл. Потребности sudo.

id=${ttyid//\/dev\/tty}
sudo cat /dev/vcs$id > screen.dump

Кстати screendump: так названный программой больше не работает на меня. Возможно, для более старых ядер только./dev/pts/N не работал на меня также. Возможно, Вы имеете некоторому дополнительному MKDEV в/dev - я помню мрачно о некоторых /dev/cuaN, но я могу быть неправым.

Мы хотели бы передать вывод по каналу вместо того, чтобы использовать screen.dump. Но так или иначе это не работает - иногда это ожидает, ВХОДЯТ.

Получение не является нормальным текстовым файлом с переводами строки, но с - например - 80x50 символы в одной последовательности.

Для выбора последних 2 строк, 1 для вывода команды, и один для строки запроса, я возвращаюсь он, выбираю 160 символов, возвращаюсь снова и выбираю 80.

rev vcs4.dat | sed 's/\(.\{160\}\).*/\1/g' | rev | sed 's/\(.\{80\}\).*/\1/g'

На всякий случай Вы когда-либо задавались вопросом, почему существует a rev программа.

Критический анализ:

  • Первые команды вводятся, таким образом перемещая строку ahed. Хорошо - просто числовое осуществление для выбора 3-й в последний раз строки или чего-то. Я работал главным образом в другом окне.
  • Не все имеют 80x50 экран. Ну, да, мы знаем. Существует $COLUMNS и $ROWS для Вашего удовольствия.
  • Вывод не всегда внизу. Новая и молодая оболочка могла бы быть в верхних строках. Хорошо - простой как это: Оцените то, что выполняет оболочка. Какая подсказка используется. Сделайте некоторое быстрое обнаружение и найдите последнюю строку с приглашением оболочки. Строка прежде (или 2. прежде), должен содержать каталог.

Первая схема сделана с explain.py

11
29.04.2017, 19:28
4 ответа

Можно использовать sed с двоичными файлами (по крайней мере, GNU sed; некоторые реализации могут испытать затруднения из-за файлов, содержащих нулевые символы или не заканчивающихся символом новой строки). Но команда, которую Вы использовали только, заменяет первое вхождение /Fit на каждой строке и строках в значительной степени бессмысленны в файле PDF. Необходимо заменить все случаи:

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

Это было бы, больше устойчивое только заменяет /Fit если это не сопровождается составляющей слова (например, не замена /Fitness; Я не знаю, содержит ли Ваш файл случаи /Fit это доставило бы неприятности). Вот один путь:

perl -pe 's!/Fit\b!/XYZ!g'
9
27.01.2020, 19:57
  • 1
    Спасибо! Это теперь работает! (1) я задавался вопросом, как sed ищут символы в двоичном содержании? sed во-первых кодирует символы запроса перед поиском? (2) В последней команде, что делает !, \b и g средний? Это может быть сделано без жемчуга только с sed? –  StackExchange for All 22.07.2011, 17:00
  • 2
    @Tim (1) Sed загружает данные в память, воздействует на него и распечатывает его. Почему это должно было бы закодировать что-нибудь? (2) g средства заменить все случаи на каждой строке, и в sed и в жемчуге. ! разделитель; можно выбрать (почти) любой символ в качестве разделителя для s команда (это идет и в sed и в жемчуге). \b означает границу слова; это существует в жемчуге, но не в sed. –  Gilles 'SO- stop being evil' 22.07.2011, 17:05
  • 3
    Приблизительно (1), потому что символы, которые Вы даете sed в команде, человекочитаемы. Если содержание для поиска в является абсолютно двоичным, как sed может найти слово запроса там? –  StackExchange for All 22.07.2011, 17:08
  • 4
    @Tim является двоичными данными, который, оказывается, человекочитаем. –  Gilles 'SO- stop being evil' 22.07.2011, 17:20
  • 5
    @Tim Да, можно передать двоичные данные в запросе. Необходимо будет вставить символы буквально в sed или окружить исходный код. –  Gilles 'SO- stop being evil' 22.07.2011, 17:30

sed ориентирован на строку, который делает его не хорошо удовлетворенным для двоичных файлов, которые структурированы как блоки не строки.
Попытайтесь использовать bbe (bbe-.sourceforge.net) вместо этого.

Alternatively, и Emacs (GNU и XEmacs) и энергия открывают файлы PDF беспрепятственно. Это не очень симпатично распечатанный, конечно, как это - смешанный текст и двоичный файл, но это достаточно в Ваших целях редактирования.
Существует плагин Pdftk для энергии, которая делает все легче, загрузите здесь (zip-файл).
Как Вы, вероятно, знаете, у обоих выше редакторов есть мощные возможности поиска-и-замены.

Кроме того, преобразование PDF к режиму QDF прежде делает редактирование файлами PDF действительно легкий.

1
27.01.2020, 19:57
  • 1
    Можно также попытаться отредактировать с sed использование -b переключатель. если это будет работать, то я добавлю это к своему ответу. –  Philomath 22.07.2011, 16:03
  • 2
    @Tim: то, под чем Вы подразумеваете, "ничего не показывает", просто пустой? какое-либо сообщение об ошибке? Кроме того, можно ли попробовать XEmacs? (все три из них работали на меня). –  Philomath 22.07.2011, 16:17
  • 3
    Не беспокойся о -b, это cygwin конкретный. –  Philomath 22.07.2011, 16:18
  • 4
    Emacs говорит, что "Файл 1.pdf является большим (9 МБ), действительно откройтесь? (y или n)". Я выбрал "y", и затем ничто не там. –  StackExchange for All 22.07.2011, 16:30
  • 5
    По всей вероятности проблема Emacs, у Вас есть XEmacs? (Я просто открыл PDF на 31 МБ без любых проблем). –  Philomath 22.07.2011, 16:36

Относительно Вашего 1-го вопроса ("просматривающий исходный код, но никакой двоичный файл"): существует несколько опций, которые Вы имеете для распаковывания внутренних двоичных потоков, которые присоединены ко многим объектам.

Мой любимый инструмент для этого является QPDF, доступным на всех крупнейших платформах ОС. Следующая команда распаковывает все потоки и все объектные потоки:

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

Теперь можно открыть PDF в любом текстовом редакторе. (Там могут все еще быть некоторые двоичные блобы: например, файлы шрифтов и профили ICC, которые не имели бы смысла для QPDF расширяться).

Повторно сжиматься expanded.pdf снова после редактирования, можно работать:

 qpdf expanded.pdf orig2.pdf

(Осторожный при ручном редактировании PDFs! Необходимо знать много об их внутреннем синтаксисе, чтобы сделать это правильно. Как только Вы добавляете или удаляете единственный байт, можно получить сообщения об ошибках от читателей PDF, которые больше не могут мочь открыть его, потому что внутренний TOC PDFs повреждается, который основан на вычислениях байтового смещения. Просто замена Fit XYZ строки должны пойти прекрасные, хотя...),

15
27.01.2020, 19:57

Используйте LibreOffice или OpenOffice, чтобы открыть PDF, просмотреть его, заменить вещи, написать новый PDF и т.д. Я думаю, что вы даже можете использовать его из командной строки или программно, если есть много документов для обработки.

Обратите внимание, что PDF-файлы из некоторых источников, например, сканеров, часто содержат страницы в виде изображений, а не текста, так что вам не повезет с ними при использовании поиска и замены.

.
0
27.01.2020, 19:57

Теги

Похожие вопросы