Добрый день! <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<=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-файлах результаты отличаются. Как можно решить эту проблему?
При добавлении текста в существующие 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 лучше превратить в не линеаризованный.