Почему при добавлении текста в уже существующий PDF файл текст переворачивается или отображается в зеркальномReflextion?

Добрый день! <br/> У меня есть задача по добавлению текста в PDF-файлы. Я использую следующий код (из plm-системы): <br/> <pre><code class="cs">public void AddText3 (FileDesc fDesc, MemoryStream outputPdfStream)
{
	using (var input PdfStream = new MemoryStream())
	using (var srcStream = fDesc. DownloadingDataStream )
	{
		srcStream.Copy( inputPdfStream); 
		inputPdfStream.Position = 0;
		using (var reader = new iText.Kernel.pdf.PdfReader (inputPdfStream) )
		using (var writer = new iText.Kernel.Pdf.PdfWriter (outputPdfStream)) 
		using (var pdfDoc = new iText.Kernel.Pdf.PdfDocument (reader, writer))
		{
			//всего листов (для цикла)
			var numberOfPages = pdfDoc.GetNumberOfPages();
			//Шрифт
			string fontPath = Path.Combine( Environment.GetFolderPath( Environment.Special Folder.Fonts ), "arial.ttf" );
			var font = iText.Kernel.Font.Pdf FontFactory.CreateFont (fontPath, iText.10.Font.PdfEncodings.IDENTITY_H, true); // Высота шрифта
			var fontSize = 14f;
			//Отступы для надписи var marginx = 20;
			var marginŸ = 20;
			//Надпись
			string text = "Учтенная копия";
			// Высота области в которой будет надпись
			var textWidth = font.GetWidth (text, fontSize);
			for (var i = 1; i&lt;=numberOfPages; i++)
			{
				//лист
				var page = pdfDoc.GetPage(i);
				var canvas = new iText.Kernel.Pdf.Canvas.PdfCanvas (page.NewContentStreamAfter(), page.GetResources(), pdfDoc);
				var y = page.GetPageSizeWithRotation().GetHeight() - marginy - fontSize;
				canvas.SaveState();
				canvas
					.SetFontAndSize (font, fontSize)
					.BeginText()
						.MoveText(0, 0)
						.ShowText (text)
					.EndText();
				canvas.RestoreState();

			}
		}
	}
}</code></pre> <br/> <br/> При тестировании кода на трех различных PDF-файлах результаты отличаются. Как можно решить эту проблему?
  • 5 ноября 2024 г. 21:43
Ответы на вопрос 2
При добавлении текста в существующие PDF-файлы можно столкнуться с проблемами, связанными с ориентацией текста и его отображением. Это может происходить по нескольким причинам:

1. **Проблемы с координатами**: Положение текста, определяемое с помощью метода `MoveText`, может быть неправильным из-за особенностей системы координат PDF, где начало координат находится в левом нижнем углу страницы. Если вы используете `MoveText(0, 0)`, то это может приводить к тому, что текст будет добавляться в неправильное место.

2. **Поворот страницы**: PDF-файлы могут иметь различную ориентацию (например, альбомная или портретная). После того как вы получили размеры страницы с помощью метода `GetPageSizeWithRotation`, нужно учитывать поворот страницы. Метод `GetHeight()` возвращает высоту страницы, но если страница повёрнута на 90 или 270 градусов, вам нужно будет правильно рассчитать положение текста.

3. **Фоновый поток**: Когда вы добавляете новый контент в PDF, важно использовать `NewContentStreamAfter()` чтобы убедиться, что новый контент добавляется поверх существующего, а не заменяет его.

4. **Кодировка шрифтов**: Иногда проблема с отображением текста может быть связана с кодировкой шрифтов и выбранным методом создания шрифтов. Убедитесь, что шрифт правильно загружается и используется.

Чтобы исправить вашу проблему, попробуйте следующее:

1. Убедитесь, что координаты для `MoveText` вычисляются правильно. Например:
   ```csharp
   var y = page.GetPageSizeWithRotation().GetHeight() - marginY - fontSize;
   ```

2. При добавлении текста учитывайте возможность поворота страницы:
   ```csharp
   var rotation = page.GetRotation();
   if (rotation == 90 || rotation == 270)
   {
       canvas.MoveText(y, page.GetPageSizeWithRotation().GetWidth() - marginX);
   }
   else
   {
       canvas.MoveText(marginX, y);
   }
   ```

3. Убедитесь, что вы используете `canvas.ShowText(...)` после вызова `MoveText(...)`, и вы можете также попытаться добавить некоторый параметр смещения, если это необходимо.

Тестируйте код с изменениями на разных PDF-файлах и смотрите, решает ли это вашу проблему. Если проблема остается, возможно, вы хотите анализировать структуру PDF-файлов с проблемами на предмет особенностей содержимого, которые могут влиять на отображение.
Вам надо в стандарт pdf. Это не Ваш текст вертит, это исходный текст в разных ориентациях и его вертит перед показом, а Ваш - нет. И тут два решения - либо смотреть как ориентирован текст в документе, либо тупо добавлять вашу накладку в конец документа со своим xref (открываете pdf текстовым редактором и в конце видите startxref - это оно). 

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