2015-06-08 2 views
1

Возможно ли использование iText для копирования PDF-страниц из полного документа PDF и возврата частичного документа на основе имени поля формы? Например, мне нужно скопировать начало документа в формате PDF и остановиться в определенном текстовом поле с именем [STOP_HERE], поэтому любое содержимое перед этими полями необходимо извлечь, поле [STOP_HERE] может быть расположено на другой странице для каждого документа , поэтому использование номеров страниц здесь не помогло бы.Извлечение страниц из файла PDF с помощью ITextSharp

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

Может ли IText выполнять эту работу здесь?

EDIT: Подробнее

[STOP_HERE] является текстовым полем AcroForms, который был помещен в документ, дизайн PDF человека, чтобы показать, что все, прежде чем этот элемент должен быть скопирован как в другой документ. Само поле не важно, я не хочу ничего заполнять или делать с ним, он просто используется в качестве сигнала, позволяющего парсеру документа останавливаться и копировать все предыдущее (верхнее) содержимое, я просто не знаю, как прочитайте все содержимое (без изменения стиля, содержимого и т. д.) перед этим полем.

+0

* остановка в определенном текстовом поле под названием [STOP_HERE] * - по * текстовому полю * вы имеете в виду текстовое поле AcroForms? Имея * [STOP_HERE] * в поле имени? Или в его содержании? Копирование нескольких страниц из PDF (не форма XFA) не является проблемой в iText (Sharp); Я просто не понимаю вашего состояния остановки; Вы, вероятно, должны поделиться образцом PDF. – mkl

+0

[STOP_HERE] - текстовое поле AcroForms, которое было помещено в документ лицом, создающим документ PDF, чтобы указать, что все, перед чем этот элемент должен быть скопирован, как это делается в другом документе. Само поле не важно, я не хочу ничего заполнять или делать с ним, он просто используется в качестве сигнала, позволяющего парсеру документа останавливаться и копировать все предыдущее (верхнее) содержимое, я просто не знаю, как прочитайте все содержимое (без изменения стиля, содержимого и т. д.) перед этим полем. – Maya

+0

* [STOP_HERE] - текстовое поле AcroForms * - это имя или содержание? – mkl

ответ

1

Возможно ли использование IText для копирования PDF-страниц из полного документа PDF и возврата частичного документа на основе имени поля формы? Например мне нужно скопировать начало PDF-документ и остановится на определенном текстовом поле под названием [STOP_HERE]

К сожалению ОП не сказать страница, содержащая поле формы [STOP_HERE], будет ли включен или нет. Так как это просто +/- 1 вопрос, я просто предположил, что страница должна быть включена.

Таким образом, задача может быть реализована следующим образом:

PdfReader reader = new PdfReader(srcFile); 

AcroFields.Item field = reader.AcroFields.Fields["[STOP_HERE]"]; 
if (field != null) 
{ 
    int firstPage = reader.NumberOfPages + 1; 
    for (int index = 0; index < field.Size; index++) 
    { 
     int page = field.GetPage(index); 
     if (page > 0 && page < firstPage) 
      firstPage = page; 
    } 

    if (firstPage <= reader.NumberOfPages) 
    { 
     reader.SelectPages("1-" + firstPage); 
     PdfStamper stamper = new PdfStamper(reader, new FileStream(dstFile, FileMode.Create, FileAccess.Write)); 
     stamper.Close(); 
    } 
} 

reader.Close(); 

код открывает исходный файл в PdfReader и сначала смотрит на поле. Если он существует, он выполняет итерацию по всем проявлениям этого поля и определяет самую раннюю страницу с появлением поля. Если есть такая страница, код ограничивает чтение страниц до этой страницы и сохраняет это ограничение с помощью PdfStamper.

+0

Но что, если мой документ - только одна страница?и [STOP_HERE] находится посередине этой страницы, скажем, как мне копировать только элементы над этим полем, игнорируя все элементы, расположенные после? – Maya

+0

Ах. Первоначально вы попросили способ * скопировать страницы PDF *. Таким образом, я, естественно, предположил, что вы имели в виду ** полные ** страницы, а не просто части страницы. Удаление содержимого со страницы может быть несколько сложным. Если достаточно скрыть дополнительный контент, можно было бы добавить путь обрезания к содержимому страницы или даже обрезать страницу соответствующим образом. Но если лишний контент действительно нужно удалить, все сложнее. В пакете iText xtra в настоящее время разрабатывается утилита очистки для целей редактирования, но пока она не идеальна. – mkl

Смежные вопросы