PDA

View Full Version : سوال: چرا کلاس RawPrinterHelper پیوست شده فارسی را چاپ نمیکند ؟



soleim_ah
سه شنبه 10 فروردین 1395, 07:14 صبح
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
namespace AAA
{
public class RawPrinterHelperString
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode , Size= 4) ]
public struct DOCINFOW
{
[MarshalAs(UnmanagedType.LPWStr)]
public string pDocName;
[MarshalAs(UnmanagedType.LPWStr)]
public string pOutputFile;
[MarshalAs(UnmanagedType.LPWStr)]
public string pDataType;
}
[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
public static extern bool OpenPrinter(string src, ref IntPtr hPrinter, int pd);

[DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
public static extern bool ClosePrinter(IntPtr hPrinter);

[DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
public static extern bool StartDocPrinter(IntPtr hPrinter, int level, ref AAA.RawPrinterHelperString.DOCINFOW pDI);

[DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndDocPrinter(IntPtr hPrinter);

[DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool StartPagePrinter(IntPtr hPrinter);

[DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool EndPagePrinter(IntPtr hPrinter);

[DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, int dwCount, ref int dwWritten);

public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
{
IntPtr hPrinter = System.IntPtr.Zero;
Int32 dwError;
DOCINFOW di = new DOCINFOW();
Int32 dwWritten = 0;
bool bSuccess;

di.pDocName = "Raw print document";
di.pDataType = "XPS_PASS";
bSuccess = false;
if (OpenPrinter(szPrinterName, ref hPrinter, (int)0))
{
if (StartDocPrinter(hPrinter, 1, ref di))
{
if (StartPagePrinter(hPrinter))
{
//MessageBox.Show(hPrinter.ToString() + "----" + pBytes + "----" + dwCount + "----" + dwWritten);
bSuccess = WritePrinter(hPrinter, pBytes, dwCount, ref dwWritten);
EndPagePrinter(hPrinter);
}
EndDocPrinter(hPrinter);
}
ClosePrinter(hPrinter);
}
if (bSuccess == false)
{
dwError = Marshal.GetLastWin32Error();
}
return bSuccess;
}
public static bool SendFileToPrinter(string szPrinterName, string szFileName)
{
FileStream stream1 = new FileStream(szFileName, FileMode.Open);
BinaryReader reader1 = new BinaryReader(stream1);
byte[] buffer1 = new byte[((int)stream1.Length) + 1];
buffer1 = reader1.ReadBytes((int)stream1.Length);
IntPtr ptr1 = Marshal.AllocCoTaskMem((int)stream1.Length);
Marshal.Copy(buffer1, 0, ptr1, (int)stream1.Length);
bool flag1 = RawPrinterHelper.SendBytesToPrinter(szPrinterName, ptr1, (int)stream1.Length);
Marshal.FreeCoTaskMem(ptr1);
return flag1;
}
public static void SendStringToPrinter(string szPrinterName, string szString)
{
IntPtr pBytes;
Int32 dwCount;
dwCount = szString.Length;
pBytes = Marshal.StringToCoTaskMemUni(szString);
SendBytesToPrinter(szPrinterName, pBytes, dwCount);
Marshal.FreeCoTaskMem(pBytes);
}
}

shahryars
سه شنبه 10 فروردین 1395, 08:15 صبح
باید رشته شما utf-8 باشه

soleim_ah
چهارشنبه 11 فروردین 1395, 08:34 صبح
باسلام . من یک فایلی را utf-8 است را به این کلاس برای پرینت ارسال میکنم ولی فقط اعداد را چاپ میکند و حروف فارسی را بصورت نامفهوم چاپ میکند که فارسی نیست .


باتشکر

soleim_ah
چهارشنبه 11 فروردین 1395, 09:39 صبح
باسلام . من یک فایلی را utf-8 است را به این کلاس برای پرینت ارسال میکنم ولی فقط اعداد را چاپ میکند و حروف فارسی را بصورت نامفهوم چاپ میکند که فارسی نیست .


باتشکر

لطفا هر چه زودتر مشکل این کلاس را برایم بفرستید خیلی ضروری است .

shahryars
چهارشنبه 11 فروردین 1395, 10:51 صبح
نوت پد پلاس رو باز کنید و فایل رو باهاش باز کنید
از تب Encoding
Character sets رو انتخاب کنید
بعد Arabic
بعد windows 1256

soleim_ah
پنج شنبه 12 فروردین 1395, 06:00 صبح
نوت پد پلاس رو باز کنید و فایل رو باهاش باز کنید
از تب Encoding
Character sets رو انتخاب کنید
بعد Arabic
بعد windows 1256


باسلام

با تشکر از توجه شما ، من فایل را در NOTEPAD ++ باز کردم و سپس مراحل را انجام دادم (ENCODING ->ARABIC-> WINDOWS-1256->SAVE)ولی هنوز این کلاس فایل را به فارسی چاپ نمیکند چرا لطفا راهنمایی فرمایید . خیلی ضروری است ..............

soleim_ah
پنج شنبه 12 فروردین 1395, 08:07 صبح
باسلام

با تشکر از توجه شما ، من فایل را در NOTEPAD ++ باز کردم و سپس مراحل را انجام دادم (ENCODING ->ARABIC-> WINDOWS-1256->SAVE)ولی هنوز این کلاس فایل را به فارسی چاپ نمیکند چرا لطفا راهنمایی فرمایید . خیلی ضروری است ..............


باسلام با تغییر di.pDataType از "Raw" به "Text" در کلاس RawPrinterHelperمشکل فارسی به شیوه بالا حل میشود ولی فونت سایز و فونت بصورت خیلی درشت چاپ میشود لطفا بفرمایید چگونه مشکل فونت و تغییر سایز را حل کنم . باتشکر فراوان :تشویق::تشویق::تشویق:

shahryars
پنج شنبه 12 فروردین 1395, 09:22 صبح
ببخشید چون من در این زمینه کار نکردم نمیدونم این جواب میده یا نه؟
Font font1 = new Font(Font name,font size);
توجه: font size به صورت float و font name به صورت string

برای تبدیل string به float هم باید از این دستور استفاده کنید
float.Parse(String);

بعد هم میتونید رشته ای که میخواید چاپ کنید رو به این صورت به فونت نسبت بدید.
string a="";
a.Font=font1;