DynamicPDF потеря качества изображения - PullRequest
0 голосов
/ 22 декабря 2009

Мы используем продукт под названием 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 ]

2 голосов
/ 22 декабря 2009

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

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

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

1 голос
/ 22 декабря 2009

Что касается продукта 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-файла.

0 голосов
/ 23 декабря 2009

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

...