2009-12-21 8 views
0

DynamicPDF이라는 제품을 사용하여 데이터베이스의 동적 데이터에서 즉석에서 PDF를 생성합니다. 그들의 문서에 따르면 소프트웨어는 이미지 바이트를 그대로두고 변경하지 않습니다. 그럼에도 불구하고 우리가 추가 한 이미지는 결과 PDF 출력에 품질 손실이있는 것으로 나타났습니다 (최소한 그것이 어떻게 보이는지). 그래서 내 질문에 DynamicPDF API를 사용하여 이미지 품질 출력이 내가 입력 한 것과 비슷하거나 비슷하게하려면 어떻게해야합니까?DynamicPDF 이미지 품질 손실

버전 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; 
} 
} 

[편집]

Here은 전과 후의 샷이다.

[편집]

된 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"); 
+0

"이전/이후"예제를 보여줄 수 있습니까? –

+0

또한 (선택/복사 이미지를 사용하여) PDF에서 이미지를 추출하고 원본 이미지와 비교할 수 있습니까? 그렇게하면 무언가가 변경되면 100 % 증거가됩니다. –

+0

위의 게시물에서 스크린 샷 전후의 링크를 추가했습니다. 어떻게 PDF에서 이미지를 추출합니까? Acrobat Reader에서이 작업을 수행 할 수있는 방법이 있다고 가정합니까? – James

답변

0

퍼지 디스플레이를 일으킨 것은 Acrobat이었습니다. 기본적으로 시스템 dpi 설정을 사용하는 대신 해상도라는 기본 설정에 Acrobat이 사용자 정의 dpi 설정 110을 사용하기로 결정했습니다 (왜!?!?). 시스템에 설정 한 후 (내 경우에는 96dpi) 이미지가 선명합니다.

2

좋아,이 크기 조정에서 가난한 노력처럼 보이지만 그것은 단지뿐만 아니라 일을 당신의 아크로뱃 리더가 될 수 실제 데이터가 완벽하게 화면에 표시됩니다.

리더에서 이미지를 선택하여 (파란색으로 강조 표시됨) 이미지를 선택한 다음 원하는 이미지 편집 프로그램에 복사하여 붙여 넣을 수 있습니다. 그렇게하면 의 리소스를 원래 솔루션으로 가져와야합니다.

PDF에서 이미지 및 기타 리소스를 추출 할 수있는 도구가 있지만 공개적으로 권장할만한 도구는 없습니다.

+0

+1 노력하십시오. PDF의 텍스트는 강조 표시되지만 이미지는 강조 표시되지 않습니다. 내가 켤 필요가있는 설정이 있습니까? – James

+0

잘 모르겠습니다. 바로 강조 할 수 있습니다. Acrobat Reader의 최신 버전에서 "도구"메뉴를 선택하면 거기에서 선택 도구를 선택해야합니다. 그들 중 한 명이 일해야합니다. –

1

DynamicPDF 제품과 관련하여 이미지가 PDF 문서에 추가 될 때 이미지의 크기 조정 또는 리샘플링이 수행되지 않습니다. Pekka는 실제로 이와 관련이 있습니다. 다른 선명도 (다른 줌 레벨에서)로 시각적으로 이미지를 나타내는 것은 독자입니다.

PDF에서 이미지를 가져올 수있는 경우 (위의 Pekka 권장 사항) 이미지 데이터가 완전히 원본이며 수정되지 않은 것을 볼 수 있습니다.

원본 이미지를 마우스 오른쪽 버튼으로 클릭하고 "Adobe PDF로 변환"을 선택하면 전체 Acrobat Pro가 필요합니다. 새롭게 작성된 PDF에서는 시각적으로 동일한 결과가 표시됩니다.

주목할 가치가있는 마지막 한 가지는 위에 표시된 코드의 비효율적 인 부분입니다. 현재 이미지 내용을 Stream으로 가져 와서 Stream 객체에서 비트 맵을 만든 다음 해당 비트 맵을 사용하여 DynamicPDF Image 객체를 만듭니다. 이 작업을 수행하는 데 권장되는 방법은 URL에서 가져온 이미지의 Stream 객체를 가져 와서 DynamicPDF의 ImageData 정적 메서드 인 "GetImage"에 전달하는 것입니다. 이 GetImage 메서드는 ImageData 객체를 반환합니다. 그런 다음 ImageData를 사용하여 DynamicPDF Image 객체를 만듭니다.

이렇게 이미지를로드하는 데에는 두 가지 분명한 이점이 있습니다. 첫째, 이미지 콘텐츠를 별도로 처리해야하는 System.Drawing.Bitmap 개체에 오버 헤드가 발생하지 않는다는 것입니다. 따라서 이론적으로 앱이 없으면 더 빠르게 실행됩니다. 두 번째 이점은 이미지 내용이 원래 있던 원래의 압축 방식으로 PDF에 추가된다는 것입니다.JPEG 이미지의 경우와 마찬가지로 비트 맵의 ​​압축과 달리 이미지의 원시 압축을 사용하면 출력 PDF 파일 크기가 작아집니다. 이 중 어느 것도 출력 PDF의 이미지 품질에 영향을 미치지는 않지만 효율성에 영향을 미치고 PDF 파일 크기를 출력 할 수 있습니다.

+0

+1이 도움말에 감사드립니다. ImageData.GetImage() 사용에 대한 귀하의 제안을 따랐습니다. 하지만 지금은 이전 구현보다 훨씬 느리다는 것을 알게되었습니다. 왜 그런가요? 내 새 코드가 위입니다. – James