Как получить PDFSharp, чтобы нарисовать вещи в правильном положении после вращения страницы?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как получить PDFSharp, чтобы нарисовать вещи в правильном положении после вращения страницы?

Сообщение Anonymous »

Я пишу настольное приложение WPF, чтобы позволить людям открывать отсканированные файлы PDF, вращать их, если это будет необходимо, а затем отредактируйте их, если это будет необходимо. Страница отображается на экране с использованием pdfium, чтобы пользователь мог видеть, что нужно сделать. Если его нужно повернуть, они нажимают кнопку «Повернуть», чтобы повернуть ее. Если его нужно отредактировать, они нажимают на соответствующую кнопку, а затем используют мышь, чтобы нарисовать систему. Windows.shapes.Rectangle на холсте. Затем они нажимают кнопку «Сохранить», чтобы сохранить редакцию (или редакции) в файл PDF. Фактические изменения в PDF вносятся с использованием PDFSHARP v1.50.4000-beta3b, загруженного через Nuget в Visual Studio 2013. Я могу рисовать коробки повсюду без проблем. Проблема возникает, когда значение вращения -это что -то иное, чем 0. Если я поворачиваю страницу 90 градусов в любом направлении (вращение = 90 или -90), то, когда я пытаюсь нарисовать коробку на странице, это все испортит. Похоже, что он обменяется высотой и шириной (превращение его от ландшафта в портрет или наоборот) страницы без изменения содержания страницы. Затем он рисует прямоугольник в точке, в которой это было бы, если бы страница была повернута еще на 90 градусов. У него большое смайливое лицо на верхней трети файла и текст на оставшейся части, а настройка вращения - 0, а ориентация - портретная. Я открываю его в своей программе и вращаю 90 градусов. Теперь это ландшафт, и смайливое лицо находится в сторону на правой трети страницы. Я пытаюсь нарисовать коробку в верхнем правом углу страницы. Когда я нажимаю кнопку Сохранить, он меняет файл, и теперь он отображается в ориентации на портретов, однако контент не изменился, поэтому теперь смайливое лицо невидимо с правого края страницы. Коробка, которую я пытался разместить в верхнем правом углу, действует так, как будто она была повернута, и теперь она находится в правом нижнем углу. Если я сделаю это хорошим продолговатым прямоугольником, я увижу, что это действительно выглядит так, как будто он был вращен со всей страницей, но без содержания. Если я сделаю это снова, с другой коробкой в ​​верхнем правом углу, а затем нажмите «Сохранить», он снова поменят высоту и ширину и повернет мою коробку в положение на 90 градусов от того места, где я ее поместил. Теперь я снова вижу смайливое лицо, но коробка все еще не там, где я хочу. Поэтому, если мое смайливое лицо перевернулось в нижней части страницы, и я нарисую коробку на его глазах (в нижней части страницы), оно сохраняет коробку в верхней части страницы. Из моего тестирования кажется, что изменение каким -то образом проводится в методе pdfdocument.save (), потому что до этого момента координаты прямоугольника - это то, чем они должны быть для текущей ориентации /позиции страницы. Он находится в помощном классе, и он хранит путь к файлу и общему количеству страниц. Это требует списка номеров страниц для вращения. Кроме того, я должен установить ориентацию на портрет (будь то или нет), потому что PDFSHARP автоматически устанавливает это в другом месте, но если я установите его вручную здесь, он правильно поворачивает страницы, и если я не установлю здесь, содержимое страницы будет вращаться, не изменяя размер /ориентацию самой страницы.public bool RotatePages(List pageNums)
{
if (pageNums.Count > 0)
{
PdfDocument currDoc = PdfReader.Open(fullPath, PdfDocumentOpenMode.Modify);

for (int i = 0; i < totalPageCount; i++)
{
PdfPage newPage = currDoc.Pages; //newDoc.AddPage();

if (pageNums.Contains(i))
{
newPage.Orientation = PdfSharp.PageOrientation.Portrait;

newPage.Rotate = (newPage.Rotate + 90) % 360;
}
}

currDoc.Save(fullPath);

return true;
}
else
return false;
}
< /code>

Далее приведен код для рисования поля редакции. Он получает список объектов System.Windows.Rect, список цветов, номер страницы, чтобы отметить и матрицу. Матрица связана с тем, что PDF отображается на изображение, но прямоугольники тянутся пользователем на холст. Изображение может быть увеличено или наносит удар по поводу, и матрица хранит эти преобразования, чтобы я мог соответствовать положению прямоугольника на холсте с соответствующей точкой на изображении/PDF. Он работает отлично, если вращение страницы равно 0. < /p>

public bool Redact(List redactions, List redactionColors, System.Windows.Media.Matrix matrix, int pageNum)
{
if (pageNum >= 0 && pageNum < totalPageCount && redactions.Count > 0 && redactions.Count == redactionColors.Count)
{
PdfDocument currDoc = PdfReader.Open(fullPath, PdfDocumentOpenMode.Modify);
PdfPage newPage = currDoc.Pages[pageNum];
XGraphics gfx = XGraphics.FromPdfPage(newPage);
XBrush brush = null;

for (int i = 0; i < redactions.Count; i++)
{
Rect redaction = redactions;
System.Windows.Media.Color redactionColor = redactionColors;

redaction.X = redaction.X / (matrix.OffsetX / newPage.Width);
redaction.Y = redaction.Y / (matrix.OffsetY / newPage.Height);
redaction.Width = redaction.Width / (matrix.OffsetX / newPage.Width);
redaction.Height = redaction.Height / (matrix.OffsetY / newPage.Height);

redaction.Width = redaction.Width / matrix.M11;
redaction.Height = redaction.Height / matrix.M12;

brush = new XSolidBrush(XColor.FromArgb(redactionColor.A, redactionColor));

gfx.DrawRectangle(brush, redaction);
}

gfx.Save();
currDoc.Save(fullPath);

return true;
}
else
return false;
}
< /code>

в матрице (и нет, я не использую ее для математики матрицы, просто используя их для передачи данных, а не использования 6 INT /DOURS, да, я знаю, что это паршивая практика кодирования, но исправление - довольно низкий приоритет): < /p>

M11 = the x scale transform
M12 = the y scale transform
M21 = the x translate transform
M22 = the y translate transform
OffsetX = the actual width of the image control
OffsetY = the actual height of the image control
< /code>

настолько ближе, насколько я могу сказать, пройдя по шагам, моя математика и все выглядят и работают точно так же, как и до Currdoc.save (fullPath); < /code>, и тогда он волшебным образом получает неправильные значения. Если я сломаю выполнение программы в любое время перед этой строкой, фактический файл не получает поле, но в тот момент, когда он проходит эту строку, она испортится. Ранее он работал, и я не помню, что я сделал, чтобы изменить его, чтобы он перестал работать. До сих пор я искал решение без удачи. Любая помощь будет очень оценена.

Подробнее здесь: https://stackoverflow.com/questions/347 ... ing-the-pa
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Bootstrap Toolp в неправильном положении при начальном падении, затем в правильном положении
    Anonymous » » в форуме Html
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Bootstrap Toolp в неправильном положении при начальном падении, затем в правильном положении
    Anonymous » » в форуме CSS
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как мне исправить неактивный div в правильном положении?
    Гость » » в форуме Javascript
    0 Ответы
    27 Просмотры
    Последнее сообщение Гость
  • Как мне исправить неактивный div в правильном положении?
    Гость » » в форуме Html
    0 Ответы
    32 Просмотры
    Последнее сообщение Гость
  • Как мне исправить неактивный div в правильном положении?
    Гость » » в форуме CSS
    0 Ответы
    25 Просмотры
    Последнее сообщение Гость

Вернуться в «C#»