0

DynamicPDFと呼ばれる製品を使用して、データベースの動的データからオンザフライでPDFを生成しています。彼らのドキュメントによると、彼らのソフトウェアはイメージバイトをそのまま残し、変更を加えていません。それにもかかわらず、追加した画像では、結果のPDF出力の品質が低下しているように見えることがわかりました(少なくとも、そのように見えます)。だから私の質問は、画質出力が私が入れたものと同じかそれに近いことを保証するために、DynamicPDFAPIで何をする必要があるかということです。

バージョン5.1.2ビルド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");
4

3 に答える 3

2

さて、これはサイズ変更の努力が不十分なように見えますが、実際のデータは完全に問題なく、Acrobatリーダーが画面上でそれを実行している可能性もあります。

リーダーで画像をクリックして(青色で強調表示されているように)画像を選択し、それをコピーして選択した画像編集プログラムに貼り付けることができるはずです。そうすれ、リソースが何に縮小されても、元のソリューションでリソースを取得する必要があります。

PDFから画像やその他のリソースを抽出するためのツールもありますが、私がすぐに推奨できるツールはわかりません。

于 2009-12-22T00:45:07.757 に答える
1

DynamicPDF製品に関しては、画像がPDFドキュメントに追加されるときに、画像のサイズ変更やリサンプリングは行われません。ペッカは実際にこれで正しいです。さまざまな鮮明度(さまざまなズームレベル)で画像を視覚的に表現しているのはリーダーです。

PDFから画像を引き出すことができる場合(Pekkaが上記で推奨しているように)、画像データは完全にオリジナルであり、変更されていないことがわかります。

これを実証するためにできるもう1つの方法は、元の画像を取得して右クリックし、[Adobe PDFに変換]を選択することです(完全なAcrobat Proが必要です)。その新しく作成されたPDFでも、同じ結果が視覚的に表示されます。

最後に注目に値するのは、上に表示したコードのわずかな非効率性です。現在、画像コンテンツをStreamとしてプルし、そのStreamオブジェクトからビットマップを作成してから、そのビットマップを使用してDynamicPDFImageオブジェクトを作成しています。これを実現するための推奨される方法は、URLから取得する画像のStreamオブジェクトを取得し、これをDynamicPDFのImageData静的メソッド「GetImage」に渡すことです。このGetImageメソッドは、ImageDataオブジェクトを返します。次に、そのImageDataを使用して、からDynamicPDFImageオブジェクトを作成します。

この方法で画像をロードすることには、2つの明らかな利点があります。1つは、画像コンテンツを個別に処理する必要のあるSystem.Drawing.Bitmapオブジェクトに関連するオーバーヘッドがないことです(したがって、理論的には、これがないとアプリはより高速に実行されます)。2番目の利点は、画像コンテンツが元のネイティブ圧縮でPDFに追加されることです。JPEG画像の場合と同様に、ビットマップの圧縮ではなく画像のネイティブ圧縮を使用すると、出力PDFが小さくなります。ファイルサイズ。これは、出力PDFの画質には影響しませんが、効率と出力PDFファイルサイズに影響を与える可能性があります。

于 2009-12-22T18:52:14.097 に答える
0

あいまいな表示を引き起こしているのはAcrobatであるということは両方とも正しかった。デフォルトでシステムdpi設定を使用する代わりに、解像度と呼ばれる設定が設定されています。Acrobatはカスタムdpi設定110を使用することを決定しました(理由はわかりません!?!?)。システム(私の場合は96dpi)に設定した後、画像は非常に鮮明でした。

于 2009-12-23T18:08:59.817 に答える