PDA

View Full Version : مشکل در چاپ Html داخل WebBrowser



niloufar
سه شنبه 24 مرداد 1385, 18:41 عصر
سلام
کنترل WebBrowser دو تا متد داره واسه چاپ:
- متد Print
- متد ExecCommand با پارامتر Print

متد دومی لزوما پنجره انتخاب نوع چاپگر را نشون میده که من نمی خوام و لذا مجبورم از اولی استفاده کنم. اما مشکل اینه که اونم ظاهرا فقط با چاپگر پیش فرض کار میکنه و نمیتونم با استفاده از کنترل PrintDocument چاپگر اونو عوض کنم.
کسی علت را میدونه!! در واقع من میخوام خودم با کد نویسی نوع چاپگرش رو برای چاپ عوض کنم و دیگه از کاربر نوع چاپگر را نپرسم و با چاپگر تعیین شده من کار کنه. ممنون میشم اگه کسی چیزی بدونه...

majid_afra222
چهارشنبه 25 مرداد 1385, 07:35 صبح
سلام
قبلا بحث شده،
متد EXECWB رو تو MSDN ببین، یا همین جا جستجو کن.

niloufar
شنبه 28 مرداد 1385, 18:39 عصر
سلام
آقای افرا:
1- بسیار خوشحال شدم که پس از مدت ها دوباره یه پست از شما در این تالار دیدم. فردی با اطلاعات شما حیفه که در این تالار فعالیت نداشته باشه.
2- تا آخرین بارهایی که شما را میشناختم و بیشتر در این تالار فعال بودید شما از VS2003 استفاده می کردید، آیا به VS 2005 سوئیچ کرده اید؟
3- اگه شما هم مثل ما از 2005 استفاده میکنید، باید عرض کنم که هر چی در متد های کنترل WebBrowser نگاه کردم این جناب ExecWb رو ندیدم، در متدهای داخل Document هم نبود. تنها همون ExecCommand بود که بنده در پست اول عرض کردم که لزوما دایلوگ Printer رو نشون میده و بعد چاپ میکنه که من نمیخوام و همونطور که عرض کردم قصد دارم خودم یه پرینتر خاص رو بهش بدم و بگم با اون و بدون سوال از کاربر چاپ کنه.
4- ممنون میشم کمکم کنید.

majid_afra222
شنبه 28 مرداد 1385, 23:39 عصر
سلام
والا
1- اول اینکه شما لطف دارید.
2- 2005 هنوز شروع نکردم، ولی خیلی راغب هستم و مشتاق.
3- این رو باید چک کنم، صبح اول وقت چک می کنم و جواب رو ارسال می کنم.
وا ایضا تو MSDN هنوز هم زندس.ExecWB .

majid_afra222
یک شنبه 29 مرداد 1385, 06:32 صبح
سلام
یه فرم با سه تا چک باکس، یه دکمه و یک مرورگر


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim path As String
path = Application.StartupPath
'MessageBox.Show(path)
TestWebBrowser.Navigate(path + "\Html.html")
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If (None.Checked) Then
WebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT , SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER)
ElseIf (PreView.Checked) Then
WebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT PREVIEW, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER)
ElseIf (PrintNoDialog.Checked) Then
WebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT , SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER )
End If
End Sub

تست شد درسته و تابع هم موجود بود.

niloufar
دوشنبه 30 مرداد 1385, 15:04 عصر
سلام
آقای افرا !!
1- انصافا این کد در حالی که اسم مرورگر یه جای کد TestWebBrowser است و یه جای دیگه کد WebBrowser1 ، تو دستگاه شما چه جوری کار کرده، من که نمی دونم!!
2- حالا به فرض هم که اسمهاشون رو یکسان کنیم، من که وقتی این کد ها را ریختم، در مورد ExecWB خطا میداد که:


'ExecWB' is not a member of 'System.Windows.Forms.WebBrowser'.

و در مورد SHDocVw هم فرمودند:


Name 'SHDocVw' is not declared.

3- من از VS2005 استفاده میکنم. اگه شما این کد رو تو 2003 نوشتید و جواب داده (البته به شرط اینکه حکایت شماره یک نباشه) لطف کنید و اگه جایی 2005 دارید، اونو اونجا تست کنید و اگه خیر لطف کرده و اونو zip کنید و upload کنید تا اونا با 2005، Convert کنم ببینم خود دات نت به جاش پیشنهادی میده یا نه.
4- ممنون

ghafoori
دوشنبه 30 مرداد 1385, 18:09 عصر
خانم نیلوفر مشکل از کد نیست شما کنترلها را اشتباه گرفتید داخل 2005 دو مرورگر است یکی که شما استفاده میکنید و جز کنترلهای دات نت است و دیگری که اقا مجید استفاده می کند کنترل اکتیوایکس است شما می توانید این کنترل را در قسمت com اضافه کردن ایتم جدید به جعبه ابزار پیدا کنید:لبخند:

niloufar
دوشنبه 30 مرداد 1385, 19:01 عصر
او...!!!!!

راستی سلام
1- باورم نمیشه آقای افرا هنوز از Com Component ها استفاده کنند!!!
2- اون کامپوننت com نسخه 1.1 است و واسه دات نت نسخه 2 و این در حالی است که نسخه 2 امکانات بسیار بسیار بالایی برای کار با htmlها در اختیار گذاشته است. حتی تو این نسخه امکان ارتباط با داخل داکیومنت و اجرا و تبادل پارامتر با JavaScript رو هم داریم. اینجا حتی توابع JS مثل getElementById و ... رو هم داریم. اینجا اینقدر چیز داریم که آدم وقتی قابلیتهایی که به نسخه 2 داده رو می بینه، اصلا دلش نمیاد برگرده و از قبلی استفاده کنه.
3- حالا یعنی چی؟! یعنی جناب میکروخان یه قابلیت به نسخه قدیمی داده که دلش خواسته از نسخه جدید حذف کنه؟! بالاخره یعنی معادلی نداره؟!!
4- اون نسخه رو هم تست کردم. بازم از این لحاظ که من می خواستم فرقی نکرد. ببینید من می خوام خودم بگم جناب مرورگر لطف کن و با چاپگر به نام "فلان" داکیومنتت رو بدون دایالوگ چاپگر چاپ کن. توجه داشته باشیم که از قضا این چاپگر "فلان"، چاپگر پیش فرض هم نیست.
مثلا فرض کنید که یه کنترل PrintDocumetn بذاریم و بگم:


PrintDocument1.PrinterSettings.PrinterName = "Microsoft Office Document Image Writer"

و بعدش از مثلا


webBrowser1.print

برای نسخه 2 یا مثلا


WebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT , SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER )

برای نسخه 1.1 استفاده کنم.
یعنی: من می خوام خودم بگم با فلان چاپگر خاص عمل چاپ را انجام بده اونم با کد نه با دایلوگ
5- آقای افرا! اولا لطفا تعیین کنید که آیا حدس جناب غفوری درسته (در مورد استفاده شما از نسخه 1.1 com) یا نه؟ و ثانیا لطفا اینی که من گفتم را چک کنید ببینید میتونید یه اسم چاپگر خاص رو بدید و بفرستید رو همون؟
6- از هر دو بزرگوار ممنون

majid_afra222
دوشنبه 30 مرداد 1385, 21:37 عصر
سلام
ممنون، ولی من گفنم که هنوز دات نت 1 موندم، تا ما به گرد پای دات نت برسیم فکر کنم 3 و 4 و 5 ش هم اومده باشه.
چشم این رو هم چک می کنم، ببینم میتونم این کار رو بکنم یا نه.

majid_afra222
دوشنبه 30 مرداد 1385, 23:02 عصر
سلام
من به دات نت 2 رسیدم.
با این کد میتونی پرینتر پیش فرض سیستم رو عوض کنی و با هر پرینتری که خواستی پرینت بگیری، فقط این یکی دیگه با دات نت 2 هستش (تست هم کردم)


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strOldPrinter As String
Dim WshNetwork As Object
Dim pd As New PrintDocument
Try
strOldPrinter = pd.PrinterSettings.PrinterName
WshNetwork = Microsoft.VisualBasic.CreateObject("WScript.Network")
WshNetwork.SetDefaultPrinter(TextBox1.Text.Trim)
pd.PrinterSettings.PrinterName = TextBox1.Text.Trim
If Not pd.PrinterSettings.IsValid Then
WshNetwork.SetDefaultPrinter(strOldPrinter)
End If
Catch exptd As Exception
WshNetwork.SetDefaultPrinter(strOldPrinter)
Finally
WshNetwork = Nothing
pd = Nothing
End Try
WebBrowser1.Print()
End Sub



امیدوارم بدردت بخوره

حامد مصافی
سه شنبه 31 مرداد 1385, 11:26 صبح
سلام
امیدوارم بدون Windows Scripting Host هم کار کنه

niloufar
چهارشنبه 01 شهریور 1385, 15:23 عصر
سلام
من به دات نت 2 رسیدم.
با این کد میتونی پرینتر پیش فرض سیستم رو عوض کنی و با هر پرینتری که خواستی پرینت بگیری، فقط این یکی دیگه با دات نت 2 هستش (تست هم کردم)

امیدوارم بدردت بخوره

سلام
آقای افرا
1- بازم بسیار ممنون
2- خوشحالم دات نت 2 ای شدید
3- حق با شماست این کد پرینتر پیش فرض رو عوض میکنه. اما یه مشکل کوچولو داره و اون اینکه این کد اعمال نمیشه تا یه بار برنامه بسته و دوباره باز شود. به عبارت دیگه و قتی برنامه باز میشه تا وقتی برنامه بسته بشه، پرینتر پیش فرضش یکسان است. لذا این کدها پرینتر پیش فرض رو عوض میکنن ولی بازم رو همون قبلی می فرستند مگر وقتی برنامه یه بار بسته و دوباره باز شود (که معلومه فایده نداره مگر اینکه اعمال هم بشه)
4- حالا این فرمایش آقای مصافی چیه؟! (شما یا خود ایشان بیشتر توضیح دهید)
5- ممنون

niloufar
چهارشنبه 01 شهریور 1385, 16:05 عصر
دوباره سلام
تو مقالات قدیمی ای که رو هاردم داشتم نگاه میکردم، این مقاله پیوست رو پیدا کردم. اسم نویسنده توش نیست ولی معمولا اینجور مقاله های باحال واسه آقای نصیری باید باشه، حالا اگه واسه فرد دیگه ای هم هست، دستش درد نکنه)
عنوان مقاله اینه: نکاتی در مورد استفاده از چاپگر
زبونش: VB6 است

حالا: یکی از بخش هاش (بخش 21) عنوانش اینه: چگونه تغییرات اعمالی روی چاپگر را به فرم های برنامه اعمال کنیم
تو این بخش گفته که تا یه قطعه کد رو اجرا نکنیم، هر کاری رو چاپگر انجام بدیم، اعمال نمیشه. فکر کنم رفع همون مشکلی باشه که کد آقای افرا داشت. البته از تابع Api به نام SendMessage استفاده کرده که من تو این تاپیک هم:
http://www.barnamenevis.org/forum/showthread.php?t=51043
لازمش داشتم ولی نتونستم تبدیلش کنم به دات نت.
حالا اگه دوستان می تونه این کدها را دات نتیش کنه تا ببینیم کار می کنه یا نه.

ممنون

niloufar
چهارشنبه 01 شهریور 1385, 18:08 عصر
بازم سلام
من یه بار دیگه کدهای آقای افرا را امتحان کردم، لزوما نباید برنامه بسته بشه. بلکه اگه مثلا تو فرم دوم داریم چاپ میکنیم، وقتی از فرم اول به فرم دوم میریم، یه بار تغییر داده میشه ولی باید حتما اون فرم بسته بشه و دوباره باز بشه تا دوباره بشه پرینتر رو عوض کرد و گرنه با همون اولی میزنه، هرچند پرینتر پیش فرض عوض میشه.
به عبارت دیگه: آقای افرا با این حساب درسته! کد شما تست شده و درست جواب داده ولی فقط بار اول تو اون فرم، بار دوم اعمال نمیشه (روی یه پرینتر غیر از بار اول) مگر اینکه اون فرم بسته شده باشه.
البته من الان رو یه دستگاه دیگه هستم. شاید رو دستگاه قبلی همون بستن کل لازم بوده، نمیدونم.

majid_afra222
پنج شنبه 02 شهریور 1385, 07:45 صبح
سلام
حق با شماست و خیلی هم جالبه.
به اینها هم نگاه کنید با API هستش، کلا پرینتر مشکل زیاد داره.
http://www.experts-exchange.com/Programming/Q_20396392.html
http://www.dotnet247.com/247reference/msgs/31/157403.aspx

حامد مصافی
جمعه 03 شهریور 1385, 10:53 صبح
4- حالا این فرمایش آقای مصافی چیه؟! (شما یا خود ایشان بیشتر توضیح دهید)

سلام
در خط زیر برنامه یک شی com از سرور (WScript (windows scripting host با نام Network رو ایجاد می کنه، پس علی القاعده این برنامه به windows scripting host نیاز داره تا اجرا بشه


WshNetwork = Microsoft.VisualBasic.CreateObject("WScript.Network")

niloufar
یک شنبه 05 شهریور 1385, 18:19 عصر
سلام
حق با شماست و خیلی هم جالبه.
به اینها هم نگاه کنید با API هستش، کلا پرینتر مشکل زیاد داره.
http://www.experts-exchange.com/Programming/Q_20396392.html
http://www.dotnet247.com/247reference/msgs/31/157403.aspx
سلام
1- بازم ممنون که پیگیری میکنید
2- خوب یعنی چی که کلا پرینتر مشکل داره. پس اینهمه برنامه که پرینتر رو انتخاب میکنن یا اصلا خود دیالوگ انتخاب پرینتر کنترل مرورگر و .... اینا چه جوری پرینتر رو ست میکنن. لابد یه راه حلی داره (یه چیزایی تو مایه های همون راه حلی که از اون مقاله توی پست 13 پیشنهاد کرده بود،‌ نگاهش کردید؟)
3- اون دو تا لینک هم که اصلا در مورد انتخاب پرینتر نبودند، یکیشون انتخاب کاغذ بود و یکی پاک کردن صف چاپ!!
4- بازم ممنون میشم اگه شما یا دوستان دیگه راه حلی پیشنهاد کنید

niloufar
دوشنبه 06 شهریور 1385, 18:06 عصر
سلام
در خط زیر برنامه یک شی com از سرور (WScript (windows scripting host با نام Network رو ایجاد می کنه، پس علی القاعده این برنامه به windows scripting host نیاز داره تا اجرا بشه


WshNetwork = Microsoft.VisualBasic.CreateObject("WScript.Network")
سلام
خوب این Wscript واسه کیه؟ ویندوز یا یه برنامه تحت ویندوز؟ اساسا کی ممکنه نباشه؟ بهتر بگم: اگه ازش استفاده شد، تا چه حد میشه به این کد نوشته شده اطمینان کرد که همه جا کار کنه؟ تو ویندوزهای مختلف (Xp, Me , 2000, 98, ...) چه تفاوتی ممکنه بوجود بیاد؟

niloufar
سه شنبه 07 شهریور 1385, 18:21 عصر
سلام
مشکل پرینتر پیش فرض را با کد آقای افرا با هر دوز و کلکی بود حل کردم. فقط میمونه اینکه در پست قبل هم عرض کردم:


این Wscript واسه کیه؟ ویندوز یا یه برنامه تحت ویندوز؟ اساسا کی ممکنه نباشه؟ بهتر بگم: اگه ازش استفاده شد، تا چه حد میشه به این کد نوشته شده اطمینان کرد که همه جا کار کنه؟ تو ویندوزهای مختلف (Xp, Me , 2000, 98, ...) چه تفاوتی ممکنه بوجود بیاد؟

majid_afra222
سه شنبه 07 شهریور 1385, 22:43 عصر
سلام
خوب از اینکه به جواب رسیدید خوشحالم، در مورد این WScript هم چیزای زیادی تو اینترنت هست، مثلا :

The Microsoft Windows Script Host (WSH) is a tool that will allow you to run Visual Basic Scripting Edition and JScript natively within Windows 2000 by clicking a script file on the Windows desktop, or by typing the name of a script file at the command prompt. Windows Script Host supports scripts written in Visual Basic Scripting Edition (VBScript) or JScript. There are two versions of the Windows Script Host: a windows-based version (wscript.exe) that provides a windows-based property sheet for setting script properties, and a command prompt-based version (cscript.exe) that provides command line switches for setting script properties. You can run either of these by typing wscript.exe or cscript.exe at the command prompt.

چندان آش دهن سوزی هم نیست، متن ساده و گویاست.
یا این آدرس که همین چیزا رو یه کمی کامل تر گفته :
http://www.activexperts.com/axscript/wsh/

حامد مصافی
پنج شنبه 09 شهریور 1385, 00:38 صبح
سلام
در ویندوز XP و 2000 مسکلی نداره
و در ویندوز باید نصب بشه (در حالت پیش فرض همراه ویندوز نصب میشه مگر اینکه کاربر نصب نکنه)
ضمناً شما می تونید این شی رو به برنامتون اضافه کنید و هنگام نصب رجیسترش کنید

niloufar
یک شنبه 12 شهریور 1385, 19:02 عصر
سلام
آقای مصافی:
1- در غیر ویندوزهای NT (مثل 98 و Me) هم نصب میشه؟ (ببخشید که نمیرم خودم نگاه کنم، چون الان این ویندوزها را ندارم)
2- اینکه فرمودید میتونید این شیء رو به برنامه اضافه کنید و هنگام نصب رجیستر کنید، منظورتون اینه که ستاپ ساز هایی مثل InstallShield خودشون دارن و نصب میکنن و رجیستر میکنن (بازم ببخشید چون الان IS رو هم نصب ندارم که نگاه کنم)، یا خودمون باید تو برنامه این کار رو انجام بدیم و آیا اون وقت نیاز به CD نصب ویندوز نیست؟ اگه میشه بیشتر توضیح بدید.
3- ممنون

حامد مصافی
یک شنبه 12 شهریور 1385, 21:52 عصر
سلام
این گزینه در فهرست کامپونت های ویندوز وجود داره و اگه کاربر ویندوز رو به طور پیش فرض نصب کنه این آیتم هم نصب میشه

در قسمت COM این شی (windows scripting host) رو به برنامه اضافه کنید.
من در ویندوز XP که باهاش کار می کنم IS ندارم
ولی تا جایی که یادمه این شی رو ساپورت می کنه

من سعی می کنم تا فردا نحوه نصب این کامپونت روی ویندوز رو براتون مرتب و پست کنم

حامد مصافی
دوشنبه 13 شهریور 1385, 09:13 صبح
سلام
Install Sheild 10.5 که من دارم Windows Scripting Host 5.6 رو ساپورت می کنه

niloufar
یک شنبه 19 شهریور 1385, 14:46 عصر
سلام
ممنون