2016-09-05 10 views
1

Я разрабатываю программу с C# и библиотекой PDFSharp. настоящее время я использую следующий код, чтобы получить X и Y координаты конкретного AcroField в PDF документе:Любой способ получить позицию AcroField в PdfSharp без «/ Rect»?

PdfTextField imageField = (PdfTextField)inForm.Fields[elementName]; 
PdfRectangle rect = imageField.Elements.GetRectangle(PdfAnnotation.Keys.Rect); 

Это прекрасно работает, если есть только 1 поле с тем же именем, присутствующим в PDF документе. Однако, если есть два поля, имена которых называются «FirstName», даже если они находятся на отдельных страницах, это, кажется, удаляет флаги «/ Rect» и «/ P», поэтому я не могу использовать их для поиска позиции или соответствующей страницы к этому полю.

Есть ли другой способ получить положение поля в PDF или любой способ активировать флаги «/ Rect» и «/ P»?

Спасибо, RBrNx

ответ

2

Что размещено в Mihai, соответствует тому, что я обнаружил при обратном проектировании PDF через PdfSharp. Если в одном документе имеется несколько полей, они вложены в родительский контейнер и являются ссылкой на этот родительский контейнер, который PdfSharp предоставит вам при использовании AcroForm.Fields accessor. Чтобы получить элементы страницы и прямоугольника для каждого поля, вы должны посмотреть на детей этого контейнера.

Чтобы получить значение, которые вы ищете, вы хотите сделать что-то вроде этого:

PdfTextField imageField = (PdfTextField)inForm.Fields[elementName]; 
    var fieldRectangles = new List<PdfRectangle>(); 

    if(imageField.HasKids) 
    { 
     PdfArray kids = (PdfArray) Elements[Keys.Kids]; 
     foreach(var kid in kids) 
     { 
     var kidValues = ((PdfReference) kid).Value as PdfDictionary; 
     var rectangle = kidValues.Elements.GetRectangle(PdfAnnotation.Keys.Rect); 
     fieldRectangles.Add(rectangle);   
     } 
    } 

На странице ссылочного элемента («/ P» тег) также доступен из этих элементов «Малыша» ,

+0

Это почти точно код, который я использовал! За исключением с 1.50.4000 Beta3 Build PdfSharp мне удалось сделать его немного короче с 'if (imageField.HasKids) { для (int i = 0; i

1

Я не знаком с PDFsharp API, но это то, как он работает в формате PDF:
- поля формы имеют объем охват документа и не страницы.
- 2 или более полей с тем же именем на самом деле представляют собой одно поле с двумя или более виджетами (аннотации виджета, визуальное представление поля). Записи/Rect и/P хранятся на уровне виджетов. Когда поле имеет один виджет, виджет объединяется с полем, так что записи/Rect и/P отображаются как часть поля.

В вашем сценарии вам нужно найти ключ/Kids, который является массивом. Проснитесь через массив/Kids (ребенок может иметь своих детей и т. Д.) До последнего уровня, где/Kids больше не присутствует. На этом уровне вы должны найти ключи/Rect и/P.
Каждый виджет может иметь свои собственные/Rect и/P ключи, поскольку они могут отображаться на разных страницах в разных положениях.