2015-02-09 3 views
4

Я просто использую порт .NET Pdfium с именем PdfiumViewer. Он просто отлично работает после визуализации в элементах управления WinForm, но когда я пытаюсь отобразить его на Bitmap для отображения в окнах WPF (или даже с сохранением на диске), у вынесенного текста проблема.Графика растровой графики и графика управления WinForm

var pdfDoc = PdfiumViewer.PdfDocument.Load(FileName); 
int width = (int)(this.ActualWidth - 30)/2; 
int height = (int)this.ActualHeight - 30;    

var bitmap = new System.Drawing.Bitmap(width, height); 

var g = System.Drawing.Graphics.FromImage(bitmap); 

g.FillRegion(System.Drawing.Brushes.White, new System.Drawing.Region(
    new System.Drawing.RectangleF(0, 0, width, height))); 

pdfDoc.Render(1, g, g.DpiX, g.DpiY, new System.Drawing.Rectangle(0, 0, width, height), false); 

// Neither of these are readable 
image.Source = BitmapHelper.ToBitmapSource(bitmap); 
bitmap.Save("test.bmp"); 

// Directly rendering to a System.Windows.Forms.Panel control works well 
var controlGraphics = panel.CreateGraphics(); 
pdfDoc.Render(1, controlGraphics, controlGraphics.DpiX, controlGraphics.DpiY, 
    new System.Drawing.Rectangle(0, 0, width, height), false); 

Примечательно сказать, что я испытал почти все возможные варианты на Graphics объекта, включая TextContrast, TextRenderingHint, SmoothingMode, PixelOffsetMode ...

Какие конфигурации я пропускаю на Bitmap объект, причина это?

enter image description here

Edit 2

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

Редактировать

Различные режимы TextRenderingHint enter image description here

также попытался Application.SetCompatibleTextRenderingDefault(false) без заметной разницы.

+1

На моем проекте заставки я была аналогичная проблема рендеринга текста на изображение. Это помогло установить TextRenderingHint. Вы уже пробовали все настройки? как результат выглядит для разных настроек? – BoeseB

+1

Опишите проблему с предоставлением текста или еще лучше укажите ссылку на снимок экрана с ошибкой. Кроме того, я бы просто отметил, что WPF всегда рисует растровые изображения, масштабированные до их DPI. Поскольку вы явно не устанавливали DPI в свой код выше, может произойти ошибка между DPI Bitmap и DPI вашего дисплея. – RogerN

+0

Также, если вы используете Application.SetCompatibleTextRenderingDefault (false); Перед отображением элемента управления? Я полагаю, что Control использует GDI + (graphics.DrawString) для отображения текста, а ваша ничья для растрового изображения использует GDI (TextRenderer.DrawText), см. Этот ответ http://stackoverflow.com/a/23230570/4369295 – BoeseB

ответ

1

Разве это не ваш issue? Посмотрите последние fix для этого. Как вы можете видеть, владелец репозитория совершил новую версию PdfiumViewer. Теперь вы можете написать так:

var pdfDoc = PdfDocument.Load(@"mydoc.pdf"); 
var pageImage = pdfDoc.Render(pageNum, width, height, dpiX, dpiY, isForPrinting); 
pageImage.Save("test.png", ImageFormat.Png); 

// to display it on WPF canvas 
BitmapSource source = ImageToBitmapSource(pageImage); 
canvas.DrawImage(source, rect);  // canvas is instance of DrawingContext 

Вот популярный подход для преобразования изображения в ImageSource

BitmapSource ImageToBitmapSource(System.Drawing.Image image) 
{ 
    using(MemoryStream memory = new MemoryStream()) 
    { 
     image.Save(memory, ImageFormat.Bmp); 
     memory.Position = 0; 
     var source = new BitmapImage(); 
     source.BeginInit(); 
     source.StreamSource = memory; 
     source.CacheOption = BitmapCacheOption.OnLoad; 
     source.EndInit(); 

     return source; 
    } 
} 
+0

Да, это все. –

+0

@MohsenAfshin Я добавил несколько примеров кода. Я тестировал его с помощью PdfiumViewer v 1.4.0.0, и он работает как шарм. Гораздо быстрее и красивее, чем при использовании ghostscrypt. Угадайте, что ваша проблема решена. – shameleo

+0

Спасибо @shameleo, я уже это сделал. –

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