Преобразование нескольких файлов EMF в один

#.net #printing

#.net #печать

Вопрос:

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

Спасибо!

Редактировать: Я понял, что могу сделать это в .net c #, используя класс PrintDocument . Но все еще возникает проблема, как установить правильный размер страницы и ориентацию в соответствии с метафайлом.

Ответ №1:

Наконец-то создано решение.

 public class MetafilePrinter
{
    private Queue<Metafile> m_MetafileQueue = new Queue<Metafile>();
    private Metafile m_CurrentMetafile;
    private MetafileHeader m_CurrentMetafileHeader; 

    public bool PrintMetaFiles(IEnumerable<string> emfFiles, string printerName)
    {
        foreach (var emfFile in emfFiles)
        {
            m_MetafileQueue.Enqueue(new Metafile(emfFile));
        }

        var printDocument = new PrintDocument();
        printDocument.PrinterSettings.PrinterName = printerName; 
        printDocument.QueryPageSettings  = printDocument_QueryPageSettings;
        printDocument.PrintPage  = printDocument_PrintPage;
        printDocument.Print();

        return true; 
    }

    void printDocument_QueryPageSettings(object sender, QueryPageSettingsEventArgs e)
    {
        m_CurrentMetafile = m_MetafileQueue.Dequeue();
        m_CurrentMetafileHeader = m_CurrentMetafile.GetMetafileHeader();
        e.PageSettings.Landscape = m_CurrentMetafile.Width < m_CurrentMetafile.Height;
        e.PageSettings.Margins = new Margins(0, 0, 0, 0);

        int paperSizeWidht = (int)((m_CurrentMetafile.Width * 100) / m_CurrentMetafileHeader.DpiY); 
        int paperSizeHeight = (int)((m_CurrentMetafile.Height * 100) / m_CurrentMetafileHeader.DpiX);
        e.PageSettings.PaperSize = new PaperSize(string.Empty, paperSizeWidht, paperSizeHeight);
        e.PageSettings.PrinterResolution.X = (int)m_CurrentMetafileHeader.DpiX;
        e.PageSettings.PrinterResolution.Y = (int)m_CurrentMetafileHeader.DpiY; 
    }

    void printDocument_PrintPage(object sender, PrintPageEventArgs e)
    {
        e.Graphics.DrawImage(m_CurrentMetafile, e.MarginBounds);
        e.HasMorePages = m_MetafileQueue.Count != 0;
    }
}