#macos #printing #pdf-generation #cgpdfdocument
#macos #печать #генерация pdf #cgpdfdocument
Вопрос:
Предполагая, что я печатаю небольшой объем текста в документе PDF, я хотел бы знать, какая часть страницы фактически используется текстом.
Например, если я отображаю короткий текстовый абзац в документе PDF, мне хотелось бы узнать высоту содержимого только этого текста, а не всей страницы формата A4 (letter).
Фон
Мне нужно отобразить длинную HTML-страницу в документ PDF, который использует меньший размер страницы. В результате содержимое отображается на нескольких страницах PDF. В настоящее время я использую NSPrintOperation
для этого.
Проблема в том, что мне также нужно отобразить страницу нижнего колонтитула на каждой странице. Для этого мне нужно динамически определять высоту этого нижнего колонтитула, чтобы я мог соответствующим образом установить нижнее поле страницы, в результате чего область нижнего колонтитула останется свободной при отображении основного (основного) содержимого HTML. Как только это будет завершено, я смогу добавить нижний колонтитул на каждую страницу отдельным шагом (используя CGPDFDocument
).
Хотелось бы, чтобы был более простой способ, но, похоже, средство визуализации HTML macOS не может обрабатывать нижние колонтитулы HTML при печати нескольких страниц.
Ответ №1:
Я нашел решение, хотя оно немного уродливое:
- Создайте PDF с содержимым нижнего колонтитула, чтобы он отображался в верхней части страницы (поля установлены равными 0).
- Прочитайте PDF в
NSPDFImageRepMBS
- Создайте
NSImageMBS
и добавьте к нему imageRep с помощьюaddRepresentation:
- Теперь изображение имеет размер исходной страницы PDF, но содержит только область содержимого нижнего колонтитула, доступную для рисования, — остальное изображение чистое.
- Сканируя линии изображения снизу вверх в поисках нечеткой линии, можно определить высоту содержимого нижнего колонтитула.
- Теперь, когда высота нижнего колонтитула известна, я могу отображать основное содержимое в формате PDF с заданным нижним полем, чтобы область нижнего колонтитула оставалась свободной
- Наконец, я создаю новый
CGPDFDocument
, просматривая каждую страницу основного PDF, рисуя эти основные страницы вместе с нижним колонтитулом (смещенным в область нижнего колонтитула страницы) на каждой странице.