Однажды я сделал что-то подобное с camlpdf . В моем случае у меня был PDF, где физическая страница формата А4 состояла из двух логических страниц формата A5, и я хотел получить обычный файл PDF со страницами формата A5 (то есть, когда логическая и физическая страница были одинаковыми).
Это было в OCaml (camlpdf также существует для F #), и мой код был следующим:
let pdf = Pdfread.pdf_of_file None in_file ;;
let pdf =
let (pdf,_perms) = Pdfcrypt.decrypt_pdf "" pdf in
match pdf with
| Some pdf -> pdf
| None -> failwith "Could not decrypt"
;;
let pdf = Pdfmarks.remove_bookmarks pdf ;;
let pages = Pdfdoc.pages_of_pagetree pdf ;;
let pages = List.fold_right (fun page acc ->
let (y1,x1,y2,x2) = Pdf.parse_rectangle page.Pdfdoc.mediabox in
let box y1 x1 y2 x2 = Pdf.Array
[ Pdf.Real y1; Pdf.Real x1; Pdf.Real y2; Pdf.Real x2 ]
in
let xm = x1 *. 0.5 +. x2 *. 0.5 in
let pagel = {page with Pdfdoc.mediabox = box y1 x1 y2 xm}
and pager = {page with Pdfdoc.mediabox = box y1 xm y2 x2}
in pagel::pager::acc
) pages [] ;;
let pdf = Pdfdoc.change_pages false pdf pages ;;
Pdf.remove_unreferenced pdf ;;
Pdfwrite.pdf_to_file pdf out_file ;;
Если iText предлагает похожие абстракции, возможно, вы можете сделать что-то подобное. Процедура следующая:
- Прочитать и (необязательно) расшифровать pdf
- Удалить закладки (необязательно)
- Получить страницы из дерева страниц
- Манипулирование страницами: вы можете переставлять, дублировать и удалять страницы, а также можете изменять их медиабоксы (ограничивающие рамки); этого должно быть достаточно для вашей цели?
- Реконструкция документа с новыми страницами
- Удалите объекты без ссылок (например, сборщик мусора)
- Запишите полученный PDF