Параметры печати из webBrowser
От: zruslan  
Дата: 03.01.17 16:34
Оценка:
Во-первых, с Наступившим всех! )
Ну, а теперь к сути вопроса: На форме есть webBrowser (речь о VisualStudio и C#). Как программно изменить такие параметры документа, как размер полей и содержимое колонтитулов?
Интересует именно программное изменение этих вещей.
Вызов webBrowser1.ShowPageSetupDialog(); не подходит, ибо надо сразу посылать документ на печать с уже примененными параметрами.
webbrowser
Re: Параметры печати из webBrowser
От: kov_serg Россия  
Дата: 03.01.17 19:01
Оценка: 42 (3)
Здравствуйте, zruslan, Вы писали:

Z>Во-первых, с Наступившим всех! )

Z>Ну, а теперь к сути вопроса: На форме есть webBrowser (речь о VisualStudio и C#). Как программно изменить такие параметры документа, как размер полей и содержимое колонтитулов?
Z>Интересует именно программное изменение этих вещей.
Z>Вызов webBrowser1.ShowPageSetupDialog(); не подходит, ибо надо сразу посылать документ на печать с уже примененными параметрами.

Когда-то давно сталкивались с подобным. Надо было быстро html->pdf нагенерить
Делалось очень своеобразным способом. (детали можно найти тут https://msdn.microsoft.com/en-us/library/aa753281(v=vs.85).aspx )
Маленькая утилитка на cs. Добавляли в зависимости SHDocVw. Делали шаблон примерно такого вида:
  template.html
<html xmlns:ie><head>
<?IMPORT NAMESPACE="IE" IMPLEMENTATION="#default">
<style type="text/css">
.lorstyle {
width:180mm;
height:275mm;
margin-left:20mm;
margin-top:5mm;
}
.pagestyle {
width:210mm;
height:297mm;
margin: 1px;
}
.pagenum {
position: relative;
top: 285mm;
margin-left:20mm;
margin-right:10mm;
text-align: right;
}
</style>
<script language="JScript">
var iPageToCreate = 1;
function AddFirstPage() {
    var w="";
    w+="<IE:DEVICERECT ID='page1' MEDIA='print' CLASS='pagestyle'>";
    w+="<IE:LAYOUTRECT ID='layoutrect1' CONTENTSRC='document'" +
        "ONLAYOUTCOMPLETE='OnRectComplete()' NEXTRECT='layoutrect2'" +
        "CLASS='lorstyle'/>";
    w+="</IE:DEVICERECT>";
    pagecontainer.insertAdjacentHTML("afterBegin", w);
}
function OnRectComplete() {
    if (event.contentOverflow==true) {
        document.all("layoutrect" + iPageToCreate).onlayoutcomplete = null;
        var w="";
        w+= "<IE:DEVICERECT ID='page" + (iPageToCreate + 1) + 
        "' MEDIA='print' CLASS='pagestyle'>";
        w+= "<div class='pagenum'>"+(iPageToCreate+1)+"</div>";
        w+= "<IE:LAYOUTRECT ID='layoutrect" + (iPageToCreate + 1) +
        "' ONLAYOUTCOMPLETE='OnRectComplete()' NEXTRECT='layoutrect" +
        (iPageToCreate + 2) + "' CLASS='lorstyle'/>";
        w+= "</IE:DEVICERECT>";
        pagecontainer.insertAdjacentHTML("beforeEnd", w);
        iPageToCreate++;
    } else {
        setTimeout("CheckPrint()", 100);
    }
}
function CheckPrint() {
    switch (dialogArguments.__IE_PrintType) {
        case "Prompt": if (printer.showPrintDialog()) PrintPrep(); break;
        case "NoPrompt": PrintPrep(); break;
        case "Preview": default: break;
    }
}
function PrintPrep() {
    if (layoutrect1.contentDocument.readyState == "complete") PrintNow();
    else Layoutrect1.contentDocument.onreadystatechange = PrintWhenContentDocComplete;
}
function PrintWhenContentDocComplete() {
    if (layoutrect1.contentDocument.readyState == "complete") {
        layoutrect1.contentDocument.onreadystatechange = null;
        PrintNow();
    }
}
function PrintNow() {
    var startPage;
    var endPage;
    var oDeviceRectCollection = document.all.tags("DEVICERECT");
    if (dialogArguments.__IE_PrintType == "NoPrompt" || printer.selectedPages == false) {
        startPage = 1; endPage = oDeviceRectCollection.length;
    } else {
        startPage = printer.pageFrom; endPage = printer.pageTo;
        if (startPage > endPage) {
            alert("Error: Start page greater than end page");
            return;
        }
        if (startPage > oDeviceRectCollection.length) {
            alert("Error: Start page greater than number of pages in print job.");
            return;
        }
        if (endPage > oDeviceRectCollection.length) {
            alert("Warning: End page greater than number of pages in print job." +
                  "Continuing Print Job.");
            endPage = oDeviceRectCollection.length;
        }
    }
    printer.startDoc("Document");
    for (i = startPage - 1; i < endPage; i++) printer.printPage(oDeviceRectCollection[i]);
    printer.stopDoc();
}
</script>
<body onload="AddFirstPage()">
<IE:TEMPLATEPRINTER ID="printer"/>
<div id="pagecontainer"></div>
</body></html>

И вызывали печать
  как-то так
public void convert(string html, string pdf,string template) {
    setup_pdfcreator(pdf,() => {
        var ie = new SHDocVw.InternetExplorer();
        object o = null;
        var ev1 = new AutoResetEvent(false);
        ie.DocumentComplete += (object pDisp, ref object URL) => { ev1.Set(); };
        ie.Navigate(html, ref o, ref o, ref o, ref o);
        ev1.WaitOne(5000, true);
        Object ot = template;
        ie.ExecWB(OLECMDID.OLECMDID_PRINT, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref ot, ref o);
        Thread.Sleep(500);
        while (ie.Busy) { Thread.Sleep(50); }
    });
}
void setup_pdfcreator(string pdf, Action fn) {
    var pc = new PDFCreator.clsPDFCreator();
    if (!pc.cStart("", false)) throw new Exception("unable to load pdf creator");
    try {
        var dp = pc.cDefaultPrinter; AutoResetEvent ev = null; string error = null;
        pc.cDefaultPrinter = "PDFCreator"; try {
            pc.cClearCache();
            var opt = pc.cOptions;
            opt.UseAutosave = 1;
            opt.UseAutosaveDirectory = 1;
            opt.AutosaveFormat = 0;
            opt.AutosaveDirectory = Path.GetDirectoryName(pdf);
            opt.AutosaveFilename = Path.GetFileName(pdf);
            opt.NoConfirmMessageSwitchingDefaultprinter = 1;
            pc.cOptions = opt;
            pc.cPrinterStop = false;
            ev = new AutoResetEvent(false);
            pc.eReady += () => ev.Set();
            pc.eError += () => { error = pc.cError.ToString(); ev.Set(); };
            fn();
        } finally { pc.cDefaultPrinter = dp; }
        if (ev != null) ev.WaitOne();
        if (error != null) throw new Exception(error);
    } finally {
        pc.cClearCache();
        pc.cClose();
    }
}

Как ни странно работало
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.