DynamicPDF потеря качества изображения

Мы используем продукт под названием DynamicPDF для создания PDF на лету из динамических данных из базы данных. Их документация говорит, что их программное обеспечение оставляет байты изображения нетронутыми и не вносит никаких изменений. Несмотря на это, мы заметили, что изображения, которые мы добавляем, по-видимому, теряют качество при выводе PDF (по крайней мере, так они выглядят). Поэтому мой вопрос заключается в том, что мне нужно делать с API-интерфейсом DynamicPDF, чтобы гарантировать, что качество изображения будет равно или близко к тому, что я вставил?

Мы используем версию 5.1.2 Build 13650, ниже приведен код, который мы используем для добавления изображения.

private void plcImageMain_LaidOut(object sender, PlaceHolderLaidOutEventArgs e)
{
 if (e.LayoutWriter.RecordSets.Current.HasData)
 {
         string productId = e.LayoutWriter.RecordSets.Current["ProductId"].ToString();
         string imgUrl = base.SetImageUrlParams(e.LayoutWriter.RecordSets.Current["ImageUrl"] as string, e.ContentArea.Width, e.ContentArea.Height);

         System.Drawing.Bitmap bm = base.GetBitmap(imgUrl);

         ceTe.DynamicPDF.PageElements.Image img = new ceTe.DynamicPDF.PageElements.Image(bm, 0, 0);
         img.Height = e.ContentArea.Height;
         img.Width = e.ContentArea.Width;
         e.ContentArea.Add(img);
 }
}

/// <summary>
/// Gets a bitmap from the requested image url
/// </summary>
/// <param name="imgCtrl"></param>
/// <param name="imgUrl"></param>
protected System.Drawing.Bitmap GetBitmap(string imgUrl)
{
 // TODO: Add some validation to ensure the url is an image.
 System.Net.WebRequest httpRequest = System.Net.HttpWebRequest.Create(imgUrl);

 using (System.Net.HttpWebResponse httpResponse = httpRequest.GetResponse() as System.Net.HttpWebResponse)
 using (Stream imgStream = httpResponse.GetResponseStream())
 {
    System.Drawing.Bitmap bm = System.Drawing.Bitmap.FromStream(imgStream) as System.Drawing.Bitmap;
    return bm;
 }
}

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

Вот скриншот до и после.

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

Код с использованием GetImage (почему так медленно?)

protected ceTe.DynamicPDF.Imaging.ImageData GetImageData(string imgUrl)
{
   ImageData imgData = null;
   using (System.Net.WebClient wc = new System.Net.WebClient())
   {
     imgData = ImageData.GetImage(wc.DownloadData(imgUrl));
   }
  return imgData;
}

GetImageData ("http://s7d2.scene7.com/is/image/SwissArmy/cm_vm_53900E--111mm_sol_front_a?fmt=jpeg&wid=400&hei=640");

3 ответа

Решение

Вы оба были правы, что именно Acrobat вызывал нечеткое отображение. В настройках есть настройка разрешения, вместо того, чтобы использовать настройку System dpi по умолчанию. Acrobat решил использовать настраиваемую настройку dpi 110 (я понятия не имею, почему!?!?). После установки системы (в моем случае 96 точек на дюйм) изображения были кристально чистыми.

Ладно, это похоже на слабое усилие по изменению размера, но это может быть так же, как если бы Acrobat Reader делал это на экране, с фактическими данными, которые были бы в полном порядке.

Вы должны быть в состоянии выбрать изображение, щелкнув его в Reader (чтобы оно выделено синим цветом), а затем скопировать и вставить его в программу для редактирования изображений по вашему выбору. Таким образом, вы должны получить ресурс в оригинальном решении независимо от того, к чему он уменьшен.

Существуют также инструменты для извлечения изображений и других ресурсов из PDF-файлов, но я не знаю, какой из них я бы порекомендовал.

Что касается продукта DynamicPDF, не выполняется никакого изменения размера или передискретизации изображения, поскольку оно добавляется в документ PDF. Пекка действительно прав с этим. Именно читатель визуально представляет изображение с разной четкостью (при разных уровнях масштабирования).

Если вы сможете извлечь изображение из PDF (как рекомендует Pekka выше), вы увидите, что данные изображения полностью оригинальные и не изменены.

Еще одна вещь, которую вы можете сделать, чтобы продемонстрировать это, - взять исходное изображение, щелкнуть по нему правой кнопкой мыши и выбрать "Преобразовать в Adobe PDF" (требуется полная версия Acrobat Pro). В этом недавно созданном PDF вы также визуально увидите те же результаты.

И последнее, на что стоит обратить внимание, это небольшая неэффективность кода, который вы отображали выше. Прямо сейчас вы извлекаете содержимое изображения в виде потока, создаете растровое изображение из этого объекта Stream и затем используете это растровое изображение для создания объекта изображения DynamicPDF. Рекомендованным способом для этого было бы взять объект Stream изображения, которое вы извлекаете из URL-адреса, передать его в статический метод ImageData DynamicPDF "GetImage". Этот метод GetImage вернет объект ImageData. Затем используйте эти ImageData для создания вашего объекта изображения DynamicPDF.

Есть два явных преимущества для загрузки изображения таким образом. Во-первых, у вас нет накладных расходов, связанных с объектом System.Drawing.Bitmap, который необходим для отдельной обработки содержимого изображения (поэтому теоретически приложение будет работать быстрее без этого). И второе преимущество заключается в том, что содержимое изображения добавляется в PDF независимо от исходного сжатия, в котором оно было изначально. Как и в случае изображений JPEG, использование собственного сжатия изображения в отличие от сжатия растрового изображения приведет к уменьшению выходного PDF-файла. размер файла. Ничто из этого не повлияет на качество изображения выходного PDF, но может повлиять на эффективность и размер выходного PDF-файла.

Другие вопросы по тегам