Здравствуйте, 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();
}
}
|
| |
Как ни странно работало