Невозможно просмотреть несколько страниц TIFF в .Net - PullRequest
3 голосов
/ 14 апреля 2009

Я пытаюсь просмотреть и распечатать многостраничные файлы TIFF из приложения C # 2005 для Windows. Печать работает нормально, но когда я отправляю свой PrintDocument в PrintPreviewDialog, я получаю два изображения первой страницы, а не изображения первой и второй страницы. У меня также есть та же проблема, когда я использую PrintPreviewControl.

Ниже приведен код для формы с 2 кнопками, PrintDocument и PrintPreviewDialog, который демонстрирует проблему.

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();
    }
}

Кто-нибудь знает, есть ли проблема с PrintPreviewDialog в .Net framework или я делаю что-то не так?

1 Ответ

3 голосов
/ 28 апреля 2009

Это ошибка с функцией Graphics.DrawImage().

Проблема задокументирована здесь: Graphics.DrawImage Bug

Рабочий код выглядит так:

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();
}
...