Как получить косвенную ссылку на объект страницы с CGPDF? - PullRequest
4 голосов
/ 09 июня 2011

Согласно Adobe "Управление документами - переносимый формат документов. Часть 1. PDF 1.7" ( Pdf32000_2008.pdf ), раздел 12.3.2.1, состояния:

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

  • Страница документа, которая должна отображаться

  • Расположение окна документа на этой странице

  • Коэффициент увеличения (увеличения)

Пример:

[page /XYZ left top zoom]

Но в моем коде

CGPDFArrayGetObject(dArray, 0, &dObj)

это CGPDFDictionaryRef.

93 0 obj
<< /Type /Annot
      /Subtype /Link
      /Rect [71 717 190 734]
      /Border [16 16 1]
      /A << /Type /Action
      /S /GoTo
      /D [3 0 R /FitR –4 399 199 533]
      >>
>>
endobj

Как мне получить 3 0 R из /D [3 0 R /FitR –4 399 199 533]?

Как получить косвенную ссылку на объект страницы, такой как объект страницы [page /XYZ left top zoom]?

Вот мой код:

CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdfRef, pageNum);
CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(pdfPage);
CGPDFArrayRef outputArray;
if(CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray))
{
    int arrayCount = 0;
    arrayCount = CGPDFArrayGetCount(outputArray );
    if(arrayCount>0)
    {
        for( int j = 0; j < arrayCount; ++j )
        {
            CGPDFObjectRef aDictObj;
            if(CGPDFArrayGetObject(outputArray, j, &aDictObj))
            {
                CGPDFDictionaryRef annotDict;
                if(CGPDFObjectGetValue(aDictObj, kCGPDFObjectTypeDictionary, &annotDict))
                {   
                    CGPDFDictionaryRef aDict;
                    if(CGPDFDictionaryGetDictionary(annotDict, "A", &aDict))//page 1 returns here
                    {
                        CGPDFArrayRef dArray;
                        if(CGPDFDictionaryGetArray(aDict, "D", &dArray))
                        {
                            CGPDFObjectRef dObj;
                            if(CGPDFArrayGetObject(dArray, 0, &dObj)){
                                CGPDFDictionaryRef annotDict;
                                if(CGPDFObjectGetValue(dObj, kCGPDFObjectTypeDictionary, &annotDict))
                                {

                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Большое спасибо за ваше воспроизведение ~, но у меня есть вопрос, откуда я могу знать, что этот номер объекта 3?

CGPDFArrayGetObject(dArray, 0, &dObj)

получить CGPDFDictionaryRef, но я не нашел поле "3 0 R"

и еще один вопрос, если я знаю, "3 0 R"

где я могу найти, выполнив поиск в вашем PDF для 3 0 obj

спасибо, ответ, спасибо, очень, очень, очень ... Я надеюсь получить ваш ответ agian!

Ответы [ 3 ]

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

Сначала , вы цитируете неправильный пример из таблицы 151, стр. 366 Справочного документа PDF, поскольку он не соответствует вашему случаю:

[page /XYZ left top zoom]

РеальныйПример, который соответствует вашему случаю:

[page /FitR left bottom right top]

, означающий:

Отображение страницы, обозначенной страницей, с ее увеличением, увеличенным настолько, чтобы соответствовать прямоугольнику, указанному левыми координатами,снизу, справа и сверху полностью внутри окна как по горизонтали, так и по вертикали.Если требуемые коэффициенты увеличения по горизонтали и вертикали отличаются, используйте меньшее из двух, центрируя прямоугольник внутри окна в другом измерении.

, поскольку ваш случай указан как:

[3 0 R /FitR –4 399 199 533]

Теперь то, что в примере называется page, в вашем случае становится 3 0 R.Последний является ссылкой на объект № 3 (поколение 0), который вы можете найти, выполнив поиск в вашем PDF для 3 0 obj.Это место, которое определяет объект № 3, который должен назвать то, что вы искали page для вашего пункта назначения .


Обновление: ЕслиВаш настоящий документ действительно содержит фрагмент [3 0 R /FitR –4 399 199 533], тогда этот же документ должен также содержать другую часть, которая определяет объект страницы (косвенно упоминаемый) как 3 0 obj.Эта часть определяет объект страницы и может выглядеть следующим образом:

 3 0 obj
   << /Type /Page
      /Parent 11 0 R
      /MediaBox [ 0 0 597.6 842.4 ]
      /Contents 31 0 R
      /Group <<
                /Type /Group
                /S /Transparency
                /CS /DeviceRGB
             >>
      /Resources 23 0 R
   >>
 endobj

Обратите внимание, как этот объект снова ссылается на три других объекта: 11 0 R, 31 0 R и 23 0 R.Последние два указывают на объекты 31 и 23, которые содержат содержимое страницы (31) и ресурсы (23), используемые ею шрифты.Первый указывает на родительский объект (11) этой страницы.

Примечание 2: Нумерация объектов не должна быть последовательной, поскольку объекты появляются в файле PDF.Единственное (почти) условие состоит в том, что нумерация уникальна.

0 голосов
/ 01 июля 2014

Проверьте код в github в vfr / Reader. Похоже, они разобрались со всеми этими ссылками. Из документа PDF не ясно, что происходит.

0 голосов
/ 29 июня 2014

Увы, пока ответы ведущие, до сих пор не ясно, что нам нужно.Фрагмент кода, который показывает номер страницы или имя, к которому мы должны перейти, поможет.

...