Как найти размер полей на странице PDF в Objective-C (CGPDF) - PullRequest
1 голос
/ 19 июня 2011

Учитывая страницу из PDF-документа, я бы хотел найти поле для текста, используя objetive-C.

Я понимаю, что уже есть много вопросов, касающихся CGPDF..., но я не смог найти ничего полезного.Я также посмотрел документацию по спецификации PDF.Я уверен, что он где-то там должен быть, но я пока не смог его найти.

Пример

Я создаю документ Word с левым и правым полем по 2,5 см каждый,Затем я печатаю в PDF.Если взять этот pdf, есть ли какой-нибудь способ выяснить ширину текста (то есть левый и правый поля страницы)?

Фон

В случае, если я лаю не на том дереве,причина, по которой я задаю этот вопрос, заключается в возможности масштабирования, как в iBooks.Если вы дважды нажмете на iBooks, он увеличит ширину основного корпуса.Это то же самое в приложении предварительного просмотра Mac (нажатие «Zoom to Fit»).

Первые мысли

Сначала я подумал, что, возможно, PDF Boxes (CGPDFPage), как kCGPDFBleedBox, можетбыть в состоянии помочь, но это не похоже, что это поможет в моем случае.

Обновление

Меня интересует только основной текст страницы.Изображения и т. Д., Которые могут находиться за пределами этого, меня не беспокоят.

Похожие записи

Быстрый и экономный просмотрщик PDF для iPhone / iPad / iOs - советы и подсказки?

Ответы [ 3 ]

4 голосов
/ 20 июня 2011

Я не знаком с функцией Apple "Zoom to Fit" и ее точным поведением (хотя я могу представить ее наиболее важное свойство) ...

Один потенциальный недостаток при использовании различных значений * Box(MediaBox, CropBox, TrimBox, BleedBox и (устарело) ArtBox) заключается в том, что пробел real все еще может быть другим (в основномбольше) из возвращаемых значений.

Ghostscript имеет специальное устройство под названием bbox, которое возвращает «ограничивающий прямоугольник» для всего отображаемого содержимого страниц.Пример:

gswin32c.exe ^
   -o nul: ^
   -sDEVICE=bbox ^
    input.pdf

возвращает (для случайного трехстраничного примера, с которым я пробовал эту команду):

%%BoundingBox: 86 122 509 719
%%HiResBoundingBox: 86.993997 122.993996 508.013984 718.001978
%%BoundingBox: 103 199 152 271
%%HiResBoundingBox: 103.408098 199.998064 151.107956 270.897953
%%BoundingBox: 103 195 185 271
%%HiResBoundingBox: 103.208059 195.000041 184.000002 270.897953

Вы, вероятно, можете игнорировать высокоточную HiResBoundingBox ценности.Это оставляет:

%%BoundingBox: 86 122 509 719
%%BoundingBox: 103 199 152 271
%%BoundingBox: 103 195 185 271

Эти четыре значения представляют координаты нижнего левого и верхнего правого углов или прямоугольника, который окружает все визуализированные пиксели.Единицами являются точки PostScript (72 points == 1 inch).

Сравните это со значениями *Box, возвращаемыми pdfinfo.exe:

pdfinfo ^
  -f 1 ^
  -l 3 ^
  -box ^
   input.pdf
 [....]
 Page    1 size: 421 x 595 pts (A5)
 Page    2 size: 421 x 595 pts (A5)
 Page    3 size: 92 x 80 pts

 Page    1 MediaBox:     0.00     0.00   595.00   842.00
 Page    1 CropBox:     87.00   123.00   508.00   718.00
 Page    1 BleedBox:    87.00   123.00   508.00   718.00
 Page    1 TrimBox:     87.00   123.00   508.00   718.00
 Page    1 ArtBox:      87.00   123.00   508.00   718.00

 Page    2 MediaBox:     0.00     0.00   595.00   842.00
 Page    2 CropBox:     87.00   123.00   508.00   718.00
 Page    2 BleedBox:    87.00   123.00   508.00   718.00
 Page    2 TrimBox:     87.00   123.00   508.00   718.00
 Page    2 ArtBox:      87.00   123.00   508.00   718.00

 Page    3 MediaBox:     0.00     0.00   595.00   842.00
 Page    3 CropBox:     92.00   194.00   184.00   274.00
 Page    3 BleedBox:    92.00   194.00   184.00   274.00
 Page    3 TrimBox:     92.00   194.00   184.00   274.00
 Page    3 ArtBox:      92.00   194.00   184.00   274.00
 [...]

Обновление: Вот скриншот, показывающий миниатюры 3-х страниц документа PDF, которые я использовал для демонстрации вышеуказанных отличий:

3-page PDF with different page sizes and *Boxes

1 голос
/ 19 июня 2011

Вы можете отобразить страницу PDF в виде растрового изображения, определить ее пиксельное состояние и получить белые поля. Взгляните на эту отличную реализацию из Skim: http://skim -app.svn.sourceforge.net / viewvc / skim-app / trunk / NSBitmapImageRep_SKExtensions.m? Revision = 7036 & content-type = text% 2Fplain

0 голосов
/ 20 июня 2011

Согласно документации CGPDF, вы можете получить до четырех блоков контента, которые определяют область, в которой контент хранится, печатается, обрезается, обрезается и так далее.Используйте функцию CGPDFPageGetBoxRect(), чтобы получить эти поля.Я не уверен в их точном назначении, так что это только мое предположение о том, какие блоки вам нужны:

CGRect mediaBox = CGPDFPageGetBoxRect(pageRef, kCGPDFMediaBox);
CGRect cropBox = CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox);
CGFloat leftMargin = CGRectGetMinX(cropBox) - CGRectGetMinX(mediaBox);

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

...