LINUX.ORG.RU

Ищу скрипт для пакетной обработки pdf

 


1

3

Добрый вечер. Пытаюсь найти скрипт, который сможет привести мета теги множества файлов pdf в порядок. Например, заменить заголовок pdf на имя самого файла, а так же дописать автора, тему, ключи. Пробовал chatgpt, попробовал программу pikepdf и pdftk. Chatgpt мне предлагал скрипты, они либо не работали, либо работали не стабильно с переменным успехом. Может кто сталкивался и сможет поделиться скриптом ? А если подскажите что-то с gui, то радости не будет предела :)

Перемещено hobbit из general

Так скрипт надо написать самому. Нужен инструмент, способный из консоли отредактировать 1 файл. Если такой есть - ну со скриптом наверное поможем.

kirill_rrr ★★★★★
()
Последнее исправление: kirill_rrr (всего исправлений: 1)
Ответ на: комментарий от etwrq

Для .pdf лучше подойдёт hexedit и что нибудь из запрешённых психотропов. Но может быть и текстовым как нибудь можно...

kirill_rrr ★★★★★
()
Последнее исправление: kirill_rrr (всего исправлений: 1)
Ответ на: комментарий от kirill_rrr

У меня получилось его сделать, может кому-то пригодится или ошибку найдете… Но в любом случае, он работает. Для программы pdftk.

#!/bin/bash

Указываем исходную и целевую папки

INPUT_DIR=«/home/name/PDF/orig/» OUTPUT_DIR=«/home/name/PDF/changed/» ERROR_DIR=«/home/name/PDF/error/»

Проверяем, существует ли исходная папка

if [ ! -d «$INPUT_DIR» ]; then echo «Ошибка: исходная папка $INPUT_DIR не найдена.» exit 1 fi

Создаем целевую папку, если она не существует

mkdir -p «$OUTPUT_DIR» if [ $? -ne 0 ]; then echo «Ошибка: не удалось создать папку $OUTPUT_DIR.» exit 1 fi

Создаем папку для файлов с ошибками, если она не существует

mkdir -p «$ERROR_DIR» if [ $? -ne 0 ]; then echo «Ошибка: не удалось создать папку $ERROR_DIR.» exit 1 fi

Указываем автора, тему и ключевые слова

AUTHOR="" SUBJECT="" KEYWORDS=""

Обрабатываем каждый PDF файл в исходной папке

for pdf_file in «$INPUT_DIR»/*.pdf; do if [ -f «$pdf_file» ]; then # Извлекаем имя файла без расширения base_name=$(basename «$pdf_file» .pdf)

# Формируем новый заголовок
TITLE="Инструкция $base_name"

# Формируем имя выходного файла
output_file="$OUTPUT_DIR/$base_name.pdf"

# Применяем метаданные
pdftk "$pdf_file" dump_data output temp_data.txt
if [ $? -ne 0 ]; then
  echo "Ошибка: не удалось извлечь метаданные из $pdf_file. Перемещаю файл в папку ошибок."
  mv "$pdf_file" "$ERROR_DIR/"
  rm -f temp_data.txt
  continue
fi

echo "InfoBegin" >> temp_data.txt
echo "InfoKey: Title" >> temp_data.txt
echo "InfoValue: $TITLE" >> temp_data.txt
echo "InfoBegin" >> temp_data.txt
echo "InfoKey: Author" >> temp_data.txt
echo "InfoValue: $AUTHOR" >> temp_data.txt
echo "InfoBegin" >> temp_data.txt
echo "InfoKey: Subject" >> temp_data.txt
echo "InfoValue: $SUBJECT" >> temp_data.txt
echo "InfoBegin" >> temp_data.txt
echo "InfoKey: Keywords" >> temp_data.txt
echo "InfoValue: $KEYWORDS" >> temp_data.txt

# Создаем новый PDF файл с обновленными метаданными
pdftk "$pdf_file" update_info temp_data.txt output "$output_file"
if [ $? -ne 0 ]; then
  echo "Ошибка: не удалось обновить метаданные для $pdf_file. Перемещаю файл в папку ошибок."
  mv "$pdf_file" "$ERROR_DIR/"
  rm -f temp_data.txt
  continue
fi

# Удаляем временный файл
rm temp_data.txt

echo "Обработан файл: $pdf_file"

else echo «Предупреждение: файл $pdf_file не найден.» fi done

echo «Все файлы обработаны.»

copentry
() автор топика
Ответ на: комментарий от copentry

Ну вот мой многопоточный скрипт. Я его в основном для кодирования мультимедиа использую. Он берёт все файлы в дереве, но пихает результаты в одну папку.

#!/bin/bash
CORE="4" # Создавать потоков

if [ "$1" = "-h" ]; then
echo 'Использование: paket_convert.bash <каталог для поиска файлов> <каталог для помещения результатов>'
echo 'Задействовано потоков: '"$CORE"
exit 0
fi
if [ "$1" = "--help" ]; then
echo 'Использование: paket_convert.bash <каталог для поиска файлов> <каталог для помещения результатов>'
echo 'Задействовано потоков: '"$CORE"
exit 0
fi

rm -R /tmp/ffmpeg/
rm /tmp/convert.bash
mkdir /tmp/ffmpeg/
id='1' # Начальный индекс файла
cd "$1"
mkdir "$2"
ALL=$( find -P ./ -type f | wc -l )

	# Создание второстепенного скрипта /tmp/convert.bash
	# $1 - id файла. $2 - путь к папке, куда надо положить результат. Файлы блокировок расположены в /tmp/ffmpeg/, имя = id, содержится строка с отн. адресом файла на перекодирование.
echo 'ALL=$( find -P ./ -type f | wc -l )' >> /tmp/convert.bash
echo 'FILE=$( cat /tmp/ffmpeg/$1 )' >> /tmp/convert.bash
echo 'DIR=${FILE%/*}' >> /tmp/convert.bash
echo 'LONG_DIR=${#DIR}+1' >> /tmp/convert.bash
echo 'NAME=${FILE:LONG_DIR}' >> /tmp/convert.bash
echo 'FILENAME=${NAME%.*}' >> /tmp/convert.bash

# для музыки
#echo 'ffmpeg -i "$FILE" -vn -acodec libvorbis -ac 1 -aq 4 "$2"/"$FILENAME".ogg > /dev/null 2>&1' >> /tmp/convert.bash
#echo 'ffmpeg -i "$FILE" -vn -acodec libmp3lame -aq 6 "$2"/"$FILENAME".mp3 > /dev/null 2>&1' >> /tmp/convert.bash

# для j1mini, 800x480
#echo 'ffmpeg -i "$FILE" -acodec copy -vcodec h264_omx -b:v 1000K "$2"/"$FILENAME".mp4 > /dev/null 2>&1' >> /tmp/convert.bash

echo 'ffmpeg -i "$FILE" -s 648x360 -acodec copy -vcodec libx264 -profile high -level 42 -qmax 22 "$2"/"$FILENAME".mp4 > /dev/null 2>&1' >> /tmp/convert.bash



echo 'rm /tmp/ffmpeg/"$1"' >> /tmp/convert.bash
echo 'echo $1 из $ALL завершено' >> /tmp/convert.bash
chmod +x /tmp/convert.bash
	# Конец создания второстепенного скрипта

		find -P ./ -type f | while read FILE
		do
while [ $( ls -1A /tmp/ffmpeg | wc -l ) -ge "$CORE" ]; do
	sleep 20
#	sleep 1
done

echo "$FILE" >> /tmp/ffmpeg/"$id"
/tmp/convert.bash "$id" "$2" &
echo $id'/'$ALL" кодируется ""$FILE"
let id++
sleep 2
#sleep 0.2
		done

while [ $( ls -1A /tmp/ffmpeg | wc -l ) -gt "0" ]; do
	sleep 3
done

Только в данном случае он скорее всего не применим - боле сложная обработка тегов и по несколько инструментов над каждым файлом. Причём логика скрипта очень простая, а вот логика обработки тегов - нет. И как раз вникать в обработку тегов .пдф из конслои я не вижу смысла если у вас уже есть инструменты и алгоритм.

kirill_rrr ★★★★★
()
Ответ на: комментарий от copentry

Только не с первого раза, надо тестировать и подсказывать алгоритму

Сдаётся мне, написать самому быстрее и проще, нежели вот этим вот заниматься. А главное без делания мозгов.

CrX ★★★★★
()
Ответ на: комментарий от copentry

Так то музыка, а у меня почти что угодно. Например я недавно через него парсер 4PDA.to запускал. Тоже самопальный и тоже на баше, там в 1 поток ждать можно было до второго пришествия.

Про kid3 я даже не слышал. На винде кодировал через aimp3, кодировщик шикарный. Потом на лине через него же, под вайном. А как обзавёлся RPi3 - начал ваять вот этот парсер чтобы напрямую через ffmpeg работать. Там же и поддержка аппаратного видеоэнкодера имеется - хорошо для перегонки сериалов. Иногда даже можно в 2 потока.

kirill_rrr ★★★★★
()

Calibre примерно может что ты хочешь, можно в настройках добавления книг сказать брать теги приоритетно из имени файла и регексп как имя парсить.

Затем можно балково изменить теги, заменить регекспами, перенести в другие колонки и тд.

Минус, что калибр ведет свою библиотеку и хранит метаданые отдельно, и если хочешь получить свои пдф с тегами, надо их еще раз пересохранить в новое место.

masa
()