2009-04-14 10 views
3

J'essaie de prévisualiser et d'imprimer plusieurs fichiers TIFF à partir d'une application Windows C# 2005. L'impression fonctionne bien, mais lorsque j'envoie mon PrintDocument à un PrintPreviewDialog, je reçois deux images de la première page plutôt qu'une bande de la première et de la deuxième page. J'ai également le même problème lorsque j'utilise PrintPreviewControl. Ci-dessous est le code pour un formulaire avec 2 boutons, un PrintDocument et un PrintPreviewDialog qui illustre le problème.Impossible de prévisualiser plusieurs fichiers tiff dans .Net

public partial class Form1 : Form 
{ 
    private Image m_Image; 
    private Int32 m_CurrentPage; 
    private Int32 m_PageCount; 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     m_Image = Image.FromFile(".\\Test-2-Page-Image.tif"); 
     m_PageCount = m_Image.GetFrameCount(FrameDimension.Page); 
    } 

    private void printDocument_BeginPrint(object sender, PrintEventArgs e) 
    { 
     m_CurrentPage = 0; 
     m_PageCount = m_Image.GetFrameCount(FrameDimension.Page); 
    } 

    private void printDocument_PrintPage(object sender, PrintPageEventArgs e) 
    { 
     m_Image.SelectActiveFrame(FrameDimension.Page, m_CurrentPage); 
     e.Graphics.DrawImage(m_Image, 0, 0); 
     ++m_CurrentPage; 
     e.HasMorePages = (m_CurrentPage < m_PageCount); 
    } 

    private void btnPreview_Click(object sender, EventArgs e) 
    { 
     printPreviewDialog.Document = printDocument; 
     printPreviewDialog.ShowDialog(); 
    } 

    private void btnPrint_Click(object sender, EventArgs e) 
    { 
     printDocument.Print(); 
    } 
} 

Est-ce que quelqu'un sait s'il y a là un problème avec le PrintPreviewDialog dans le cadre .Net ou je fais quelque chose de mal.

Répondre

3

C'est un bug avec la fonction Graphics.DrawImage().

Le problème est documenté ici: Graphics.DrawImage Bug

Le code de travail ressemble à ceci:

img.SelectActiveFrame(FrameDimension.Page, curPage); 
using(MemoryStream stm = new MemoryStream()) 
{  
    img.Save(stm, imgCodecInfo, encParams); // save to memory stream 
    Bitmap bmp = (Bitmap)Image.FromStream(stm); 
    e.Graphics.DrawImage((Image)bmp,0,0); 
    bmp.Dispose(); 
}