- Вопрос или проблема
- Подробные шаги
- Ответ или решение
- Подготовка к работе
- 1. Создание рабочего каталога
- 2. Помещение входного файла
- Процесс создания нового PDF
- 3. Создание пустого PDF
- 4. Изоляция страниц из входного PDF
- 5. Обрезка страниц
- 6. Клонирование и сборка pdftk-java
- 7. PATCH для трансформации
- 8. Применение изменений и создание первого этапа
- 9. Завершение создания
- Заключение
Вопрос или проблема
У меня есть 2-страничный PDF-документ. Я хотел бы создать новый одностраничный PDF-документ с частью первой страницы оригинального документа и частью второй страницы (см. ссылку на изображение):
Какой лучший способ сделать это?
Одна из целей – избежать “растрирования” документа. Буквы должны оставаться “буквами” (а не изображениями букв), и любые изображения в входном PDF должны сохраняться в своем оригинальном виде и не подвергаться повторной выборке. Я довольно уверен, что описанный здесь подход достигает этого.
В общем, подход таков:
- Изолировать каждую входную часть в отдельный PDF-файл
- Создать пустой PDF с желаемыми конечными размерами
- (Зло)употребить pdftk, чтобы поместить части в пустой документ
Похоже, что можно пропустить шаг 1 выше и сделать это в рамках шага 3, но я не мог понять, как 1) выбрать страницу из входного и 2) обрезать входную страницу перед вставкой в пустой документ.
Подробные шаги
- Создайте директорию “рабочее пространство”
mkdir pdftk && cd pdftk;
- Поместите входной файл
cp ~/Downloads/ticket.pdf .;
- Создайте пустой PDF, который соответствует желаемым конечным размерам
magick xc:none -page Letter a.pdf;
- Изолируйте входную страницу 1 (и аналогично для страницы 2)
pdftk ticket.pdf cat 1 output ticket-p1.pdf
- Обрежьте входные страницы
pdfcrop --margins '0 0 0 -440' ticket-p1.pdf ticket-p1-cropped.pdf
git clone 'https://gitlab.com/pdftk-java/pdftk.git' source;
cd source && git checkout origin/master
mvn package -DskipTests=true
- Первоначальная сборка, чтобы убедиться, что у вас есть все необходимое. Исправьте любые ошибки сборки сейчас (правильная версия jdk в пути и т.д.).
- Примените следующий патч
diff --git a/java/com/gitlab/pdftk_java/filter.java b/java/com/gitlab/pdftk_java/filter.java index c2b92d5..dea82e9 100644 --- a/java/com/gitlab/pdftk_java/filter.java +++ b/java/com/gitlab/pdftk_java/filter.java @@ -415,7 +415,7 @@ class filter { float[] trans = null; if (mark_page_rotation == 0) { - trans = new float[] {mark_scale, 0, 0, mark_scale, h_trans, v_trans}; + trans = new float[] {1, 0, 0, 1, (float)40, (float)450}; } else if (mark_page_rotation == 90) { trans = new float[] {
- Как вы можете видеть из изменения, вы можете масштабировать и перемещать ваш ввод по желанию.
- Запустите измененный код
mvn package -DskipTests=true
cd target/
java -jar pdftk-java-*.jar ../../blank.pdf background ../../ticket-p1-cropped.pdf output ../../phase1.pdf
- Доработайте
filter.java
снова и создайте вторую фазу:java -jar pdftk-java-*.jar ../../phase1.pdf background ../../ticket-p2-cropped.pdf output ../../phase2.pdf
Ответ или решение
Чтобы переместить части одной страницы PDF на другую, следуя вашему описанию, необходимо выполнить несколько четко задействованных шагов. Мы избежим растрирования, сохранив текст в векторном формате и обеспечив сохранность изображений. Вот детальный алгоритм для выполнения этой задачи.
Подготовка к работе
1. Создание рабочего каталога
Создайте новый каталог для работы, где будут храниться все необходимые файлы.
mkdir pdftk && cd pdftk
2. Помещение входного файла
Скопируйте свой PDF файл в созданный рабочий каталог.
cp ~/Downloads/ticket.pdf .
Процесс создания нового PDF
3. Создание пустого PDF
Создайте пустой PDF-документ с необходимыми размерами (например, письмо формата Letter).
magick xc:none -page Letter a.pdf
4. Изоляция страниц из входного PDF
Используем pdftk
для извлечения нужных страниц из исходного документа. Например, для первой страницы:
pdftk ticket.pdf cat 1 output ticket-p1.pdf
А для второй страницы:
pdftk ticket.pdf cat 2 output ticket-p2.pdf
5. Обрезка страниц
Необходимо обрезать страницы, чтобы изолировать нужные части. Для этого воспользуемся pdfcrop
:
pdfcrop --margins '0 0 0 -440' ticket-p1.pdf ticket-p1-cropped.pdf
pdfcrop --margins '0 0 0 0' ticket-p2.pdf ticket-p2-cropped.pdf
6. Клонирование и сборка pdftk-java
Теперь клонируем репозиторий pdftk-java
и собираем проект.
git clone 'https://gitlab.com/pdftk-java/pdftk.git' source
cd source && git checkout origin/master
mvn package -DskipTests=true
7. PATCH для трансформации
Для настройки масштабирования и трансляции модифицируем файл filter.java
, заменив значения в массиве trans
на ваши параметры по желанию.
trans = new float[] {1, 0, 0, 1, (float)40, (float)450};
8. Применение изменений и создание первого этапа
После сбора проекта, запустите следующие команды для комбинирования обрезанных частей. Сначала добавляем первую обрезанную страницу к белому PDF:
java -jar pdftk-java-*.jar ../../a.pdf background ../../ticket-p1-cropped.pdf output ../../phase1.pdf
9. Завершение создания
Теперь добавляем часть из второй страницы:
java -jar pdftk-java-*.jar ../../phase1.pdf background ../../ticket-p2-cropped.pdf output ../../final_output.pdf
Заключение
Следуя этому пошаговому руководству, вы сможете создать новый PDF-документ, который будет включать избранные части из двух страниц исходного документа. Процесс включает извлечение, обрезку и комбинирование частей, гарантируя, что текст останется в векторном формате и изображения будут качественными.
Этот метод предоставляет надежный способ манипуляции PDF-документами без потери качества, что делает его предпочтительным выбором для профессионального использования.