Как получить косвенную ссылку на объект страницы с помощью CGPDF?

#iphone #pdf #cgpdf

#iPhone #PDF #cgpdf

Вопрос:

В соответствии с «Управление документами — переносимый формат документа — часть 1: PDF 1.7» от Adobe (Pdf32000_2008.pdf), раздел 12.3.2.1 гласит:

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

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

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

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

Пример:

[page /XYZ left top zoom]

Но в моем коде

 CGPDFArrayGetObject(dArray, 0, amp;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, подобный [page /XYZ left top zoom] объекту page?

Вот мой код:

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

                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
  

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

 CGPDFArrayGetObject(dArray, 0, amp;dObj)
  

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

и еще один вопрос, если я знаю, это «3 0 R»

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

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

Ответ №1:

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

 [page /XYZ left top zoom]
  

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

 [page /FitR left bottom right top]
  

значение:

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

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

 [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 . Эта часть определяет объект page и может выглядеть следующим образом:

  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. (Почти) единственным условием является то, что нумерация является uniq.

Комментарии:

1. большое вам спасибо за воспроизведение ~ но у меня есть вопрос, откуда я могу узнать, что номер этого объекта равен 3? CGPDFArrayGetObject (DArray, 0, amp; dObj) получить CGPDFDictionaryRef, но я не нашел поля «3 0 R» и другой вопрос, если я знаю, что это «3 0 R», где я могу найти, выполнив поиск в вашем PDF для 3 0 obj спасибо, ответьте, спасибо вам большое, очень, очень большое … Я надеюсь получить ваш ответ снова и снова!

2. @user476489 Этот ответ выглядит довольно хорошо — если он отвечает на ваш вопрос, пожалуйста, отметьте его как ответивший. Просматривая ваши 4 заданных вопроса, вы не отметили ни один из них как ответ. Кроме того, если другие ответы тоже помогли, проголосуйте за них.

Ответ №2:

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

Ответ №3:

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