Поиск текста, который я добавил в PDF с помощью iText 7 - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь выяснить, как найти текст, который я ранее добавил в PDF с помощью iText7.

Я играю с iText7 и получаю следующий код:

static void Main(string[] args)
{
  PdfDocument pdfDocument = new PdfDocument(new PdfWriter("./test.pdf"));
  pdfDocument.AddNewPage(PageSize.LETTER.Rotate());

  Document document = new Document(pdfDocument);

  PdfFont helv = PdfFontFactory.CreateFont(StandardFonts.HELVETICA);

  Paragraph paragraph = new Paragraph("test string");
  paragraph.SetFont(helv);
  paragraph.SetFontSize(8);
  paragraph.SetFixedPosition(500, 194, 100);
  document.Add(paragraph);
  document.Close();

  return;
}

Затем я запускаю другой код, чтобы получить мне потоки, которые показывают мне следующее:

q
BT
/F1 8 Tf
500 197.54 Td
(test string)Tj
ET
Q

Следует отметить, что там, где я указал позицию Y, равную 194, полученный PDF показывает 197.54. Если я добавлю (предоставленный пользователем) текст в PDF, а затем захочу go вернуться позже и заменить этот текст чем-то другим, я могу знать, что по крайней мере для указанного c шрифта / размера мне придется добавить 3,54 к первоначально указанному YI; Я предполагаю, что это как-то связано с базовой линией шрифта v. IText, указывающей нижнюю часть текстового блока.

Мой вопрос заключается в том, как я могу вычислить, что такое «3,54» для любого другого шрифта или размера Я мог бы использовать. Есть ли информация, которую я могу получить из iText, чтобы помочь, или это просто «умножить размер шрифта на 0,44 для Helvetica и 0,35 для Courier, et c»?

Пока, и, возможно, это просто было К счастью, я не видел проблем с разделением строки текста на различные команды Td / Tj, поэтому на данный момент я буду игнорировать эту потенциальную проблему в будущем.

Спасибо!

1 Ответ

0 голосов
/ 27 марта 2020

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

Эти сложности, прежде всего, связаны с возможностью эмуляции HTML / CSS -подобных функций настройки типа текста.

Кроме того, iText применяет округление к числам, которые записывает в поток контента.

Если вы хотите легко распознать позицию, которую вы задали, не заставляйте iText определять макет текста, а делайте это самостоятельно и используйте координаты, которые не повредят при округлении, например, вместо

Paragraph paragraph = new Paragraph("test string");
paragraph.SetFont(helv);
paragraph.SetFontSize(8);
paragraph.SetFixedPosition(500, 194, 100);
document.Add(paragraph);

do

PdfCanvas canvas = new PdfCanvas(pdfDocument, 1);
canvas.BeginText()
      .SetFontAndSize(helv, 8)
      .MoveText(100, 194)
      .ShowText("test string")
      .EndText();

, в результате чего

BT
/F1 8 Tf
100 194 Td
(test string) Tj
ET

позволяет вам сразу узнать ваши координаты.

(Конечно, это означает что значение y относится не к самому низу текста, а к его базовой строке.)


При этом вы упоминаете, что хотите go вернись позже и повтор зашнуруйте этот текст чем-нибудь еще . Пожалуйста, позвольте мне рекомендовать против этого. Текст в потоках содержимого PDF не предназначен для такого редактирования. Здесь вы можете найти много вопросов о переполнении стека людьми, которые попробовали это и столкнулись с проблемами после легкого старта. Прочитайте этот ответ перечисляя некоторые из препятствий.

Даже если вы хотите редактировать только те документы, которые вы создаете сами, и, следовательно, до некоторой степени контролировать их, вы не защищены от таких проблемы, например, после обновления библиотеки.

Альтернативой может быть использование полей формы AcroForm (которые вы можете сделать доступными только для чтения, чтобы предотвратить случайные манипуляции и даже сгладить, как только больше не ожидается никаких изменений).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...