• 0

Printing across a network using C#


Question

Hi all

I am currently writing a service that will run once per day, retrieve data from a SQL database, and print some reports.

Here is the problem:

I have an xml config file which contains a report code (eg RPT001) and the printer it is to print to. This means that in future if I want to, I can simply change the printer name without too much disruption and the reports will be redirected elsewhere.

However, I am unable to set the printer name so that the report gets printed out. When I use :

// If we have specified a printer name print to this one otherwise the

// default printer will be used

if (_printerName != "")

{

pd.PrinterSettings.PrinterName = String.Format("{0}", _printerName);

}

A call to pd.PrinterSettings.IsValid, always returns false.

I have been looking into the PrintingPermissions topic, however I am unable to find a proper clear sample of how to use it so that I can grant access to my code to be able to print across the network.

The printers are connected to a central print server, however specifying "\\servername\printer" doesnt seem to work either.

To complete the picture, the code which performs the printing is in its own DLL and the service references this DLL.

What changes need to be made and where to get this to work?

Any and all help is very much appreciated :D

Link to comment
https://www.neowin.net/forum/topic/613622-printing-across-a-network-using-c/
Share on other sites

16 answers to this question

Recommended Posts

  • 0

Hi,

Printing permissions work like so:

PrintingPermission perm = new PrintingPermission(System.Security.Permissions.PermissionState.Unrestricted);
perm.Level = PrintingPermissionLevel.AllPrinting;

Setting PrinterSettings.PrinterName should accept the sting network printer name, however, it might be easier to create a server side local printer that points to the network printer, and print to the local printer instead.

I haven't done much printing in .NET yet, but I will keep looking into it for you.

  • 0

Ahh thanks for the reply, but where do I put this code?

Does it go into my service, or into the printing DLL.

Ultimately the service I am writing will sit on a server somewhere and just poll every day, so I need it to be as hassle free as possible

  • 0

Thanks Antaris for your help.

I actually got it working without the code permissions part. Turned out the printer names had been renamed to all caps and that was throwing the code off.

So when I changed these in my config file it worked fine.

  • 0

Ok, I'm back again with a similar issue and this one has me stumped.

After running fine for months, I added a new printer name to the xml file, in the same format ... \\server\printername

However, when the code runs normally, I get an error back saying the printer name is invalid:

// If we have specified a printer name print to this one otherwise the 
// default printer will be used
if (_printerName != "")
{
pd.PrinterSettings.PrinterName = String.Format("{0}", _printerName);
}


if (pd.PrinterSettings.IsValid != false)
{
			//  Print stuff here
}

However, when I step through the code in debug mode, IsValid becomes true and the reports print fine.

I figured it had something to do with how long it was taking me to step to the next line of code (some sort of network delay possibly on name resolution), so I added a Sleep statement on the current thread to see if that would fix it - no such luck.

I know the printer name is valid, as I can print to it when I step through the code in debug mode, however this has to be deployed and just work so this cant be an option.

Any ideas would be appreciated.

Thanks

  • 0

Yeah the versions are the exact same, the only thing that was different is the name of the printer being passed in.

I've actually now got this working:

1) Tried the source code on a colleagues machine ---> worked flawlessly, not a problem (!)

2) Removed the network printer from my machine (again) and it now works no problem (!)

So thats that little bit sorted out.

Now if only I could make the pages print properly in landscape mode, I'd be done.

I've tried setting

e.PageSettings.Landscape = true

in the PrintPage event handler, but it doesnt work the way I want it to.

Back to the drawing board. . . . . . . .

  • 0

Qwerky windows flaws eh?

  ramesees said:
Now if only I could make the pages print properly in landscape mode, I'd be done.

I've tried setting

e.PageSettings.Landscape = true

in the PrintPage event handler, but it doesnt work the way I want it to.

Back to the drawing board. . . . . . . .

You would have thought that would be the answer, but alas no, you have to apply that setting earlier:

public void DoPrint(string printerName) {
   PrintDocument document = new PrintDocument();
   document.PrinterSettings.PrinterName = printerName;
   document.DefaultPageSettings.Landscape = true;
   document.PrintPage += new PrintPageEventHandler(this.PrintPage);
   document.Print();
}

protected void PrintPage(object sender, PrintPageEventArgs e) {
   // do work
}

Hope that helps!

  • 0

Hi Antaris, thanks for your help, I tried that but that doesnt work either :(

I am working with custom written print code and I need to make it physically rotate the output on the page (like landscape, only every control and text box etc... has to be rotated by 90 degrees).

So its the mapping of one set of co-ordinates to another thats kind of got me a little stumped.

  • 0

Any gurus want to offer an explanation to this little doozey ?

I have some very simple test code to test whether or not the network printer I am printing to is valid or not (based on its name)

When I have it for printer 1 (example) I get True before and after I change the printer name

PrintDocument pd = new PrintDocument();

Console.WriteLine("PrinterSettings: {0}", pd.PrinterSettings.IsValid.ToString());
pd.PrinterSettings.PrinterName = @"\\printserver\printer1"
Console.WriteLine("PrinterSettings: {0}", pd.PrinterSettings.IsValid.ToString());

However when I have it for printer 2 (example) I get True before and False after I change the printer name.

Although when I delete printer 2 from Printers and Faxes and add it again, I get True, True, but any change to the printer preferences of this printer gives True, False again.

PrintDocument pd = new PrintDocument();

Console.WriteLine("PrinterSettings: {0}", pd.PrinterSettings.IsValid.ToString());
pd.PrinterSettings.PrinterName = @"\\printserver\printer2"
Console.WriteLine("PrinterSettings: {0}", pd.PrinterSettings.IsValid.ToString());

I am absolutely tearing my hair out over this now, and am about to throw it in the bin (figuratively of course).

Does anyone have any advice to offer me, network related, or hardware, or anything, it would be so much appreciated.

Thanks :D

By the way, printer 2 is a lexmark t644 printer, if that helps anything.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • It seems like I'm just renting games now. I can't resell them and they can be removed from the steam or Epic store or the servers shut down at any time.
    • Sure - let's expand on that a bit then to try and be of more help. It's not a one-time use code that can be gamed - each time the proof is required a new transaction takes place to go through the "proof" process. It's a unique step each time. Not a...reusable QR code or pass so to speak. Each time proof is required, a new cryptographic transaction is required. The tricky part here, is trusted issuers. That is still needed. Since this is open source - it doe snot mean that Google has to be the issuer. Google has just provided the tooling to do this, but they don't store the data - to be clear. Presumably, again - you would have some type of government or state issued digital ID that supports the zero-knowledge functions. Effectively, the same entities today that have your information and you (assumingly trust) would continue to have it, it would just be able to be leveraged in a more private manner when you go somewhere or interact with anything requireing age verification. To fake this, someone would need to have a legitimate private key tied to an actual real identity. Cryptographic checks using zero-knowledge would fail otherwise - and again - it can't be used over and over again. Can someone screw up and somehow leak that private key? Sure. No different than leaking your password to your private accounts - a password change would be necessary and let's hope that future implementation of ZKP-based identities bake in some kind of 2FA/MFA for better security. There's not much to hack here, as I said - really comes down to the issuer. If you receive this from the government, none of your real data gets sent to say "MyHubOfChoice.com" when doing age verification - the protocol is only designed to say "Yes - I meet the requirement." Reality is, this keeps you more anonymous than you could ever be today with age verification without having to share anything else about you. However, it's worth stating that anonymity isn't the goal with ZKP - it's removing disclosure. True anonymity is more difficult, as how everything works today to an extent you need to prove who you are with a "trusted" source (ie government/state issued ID). And that data, at the end of the day, does sit in a centralized db as designed. Could that change in the future, perhaps. But the goal of this is just to not have to hand over anymore information than you need to.
    • Oh yeah because its SO hard to duplicate some of the server's logic on the client
    • Software versions increase while older ones are deprecated. This is nothing new, except now it's not included with Windows. Do you not upgrade your software? The biggest issue for me living with 2.0 was that the new versions never upgraded it, it installed side-by-side. I accidentally launched the shite version more than once on accident.
    • They would have to include .NET (not be to be confused with legacy .NET Framework), and they don't. That might be why...dunno. Or maybe because it's open source (guessing)? It's kind of nice to have it separated from the OS.
  • Recent Achievements

    • One Year In
      K.I.S.S. earned a badge
      One Year In
    • Week One Done
      solidox earned a badge
      Week One Done
    • Dedicated
      solidox earned a badge
      Dedicated
    • Week One Done
      Devesh Beri earned a badge
      Week One Done
    • Week One Done
      956400 earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      444
    2. 2
      ATLien_0
      162
    3. 3
      +FloatingFatMan
      147
    4. 4
      Nick H.
      66
    5. 5
      +thexfile
      61
  • Tell a friend

    Love Neowin? Tell a friend!