Как перенести часть одной страницы PDF на другую страницу PDF?

Вопрос или проблема

У меня есть 2-страничный PDF-документ. Я хотел бы создать новый одностраничный PDF-документ с частью первой страницы оригинального документа и частью второй страницы (см. ссылку на изображение):

Иллюстрация проблемы

Какой лучший способ сделать это?

Одна из целей – избежать “растрирования” документа. Буквы должны оставаться “буквами” (а не изображениями букв), и любые изображения в входном PDF должны сохраняться в своем оригинальном виде и не подвергаться повторной выборке. Я довольно уверен, что описанный здесь подход достигает этого.

В общем, подход таков:

  1. Изолировать каждую входную часть в отдельный PDF-файл
  2. Создать пустой PDF с желаемыми конечными размерами
  3. (Зло)употребить pdftk, чтобы поместить части в пустой документ

Похоже, что можно пропустить шаг 1 выше и сделать это в рамках шага 3, но я не мог понять, как 1) выбрать страницу из входного и 2) обрезать входную страницу перед вставкой в пустой документ.

Подробные шаги

  1. Создайте директорию “рабочее пространство”
    • mkdir pdftk && cd pdftk;
  2. Поместите входной файл
    • cp ~/Downloads/ticket.pdf .;
  3. Создайте пустой PDF, который соответствует желаемым конечным размерам
    • magick xc:none -page Letter a.pdf;
  4. Изолируйте входную страницу 1 (и аналогично для страницы 2)
    • pdftk ticket.pdf cat 1 output ticket-p1.pdf
  5. Обрежьте входные страницы
    • pdfcrop --margins '0 0 0 -440' ticket-p1.pdf ticket-p1-cropped.pdf
  6. git clone 'https://gitlab.com/pdftk-java/pdftk.git' source;
  7. cd source && git checkout origin/master
  8. mvn package -DskipTests=true
    • Первоначальная сборка, чтобы убедиться, что у вас есть все необходимое. Исправьте любые ошибки сборки сейчас (правильная версия jdk в пути и т.д.).
  9. Примените следующий патч
    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[] {
    
    • Как вы можете видеть из изменения, вы можете масштабировать и перемещать ваш ввод по желанию.
  10. Запустите измененный код
    • mvn package -DskipTests=true
    • cd target/
    • java -jar pdftk-java-*.jar ../../blank.pdf background ../../ticket-p1-cropped.pdf output ../../phase1.pdf
  11. Доработайте 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-документами без потери качества, что делает его предпочтительным выбором для профессионального использования.

Оцените материал
Добавить комментарий

Капча загружается...