#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, конечно, не ясно, что происходит.