• 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

    • "all the way down" by 33 whole dollars. Amazing. You shouldn't have.
    • If they make a portable version, I might give it a try, but I will always prefer hotkeys to that approach
    • The Synology DS923+ is down to $610 just for today on Newegg by Steven Parker Right now on Newegg, and only for today (June 26) you can find the Synology DS923+ discounted all the way down to $609.99 when using a coupon during checkout, down from it's normal $642.99 price. Although we haven't reviewed the DS923+ on Neowin, we have seen Synology before and rated it quite highly. Besides, the DS1522 even has the same AMD R1600 CPU. Some people would consider Synology homelab NAS equipment the "gold standard", and as such, competitors strive to do as good, at least in regard to the Operating System, DSM, which ticks all the boxes for amateurs, professionals and small business users for its inclusion of mobile apps for core app services such as Surveillance Station, and more. Here are the most important specifications: Synology DS923+ CPU AMD Ryzen R1600 2-core 2.6 (base) / 3.1 (turbo) GHz Graphics No Memory 4 GB DDR4 SODIMM, maximum 32 GB (16 GB x 2) Disk Capacity 72 TB (18TB x 4) RAID Level RAID 0, 1, 5, 6, 10, and JBOD + SHR (Synology Hybrid RAID) Network 2 x RJ-45 1 GbE Internal storage 2 x M.2 2280 NVMe Slot USB Ports 1 x USB 3.2 (5 Gbps) HDMI 1 x Expansion 1 x eSATA 1 x Gen3 x2 network upgrade slot Size (H/W/D) 166 mm x 199 mm x 223 mm Weight 2.24 kg Power 35.51 W (Access) 11.52 W (HDD Hibernation) What's in the box? Main Unit X 1 Accessory Pack X 1 AC Power Adapter X 1 AC Power Cord X 1 RJ-45 LAN Cable X 2 Quick Installation Guide X 1 You may notice that the DS923+ does not have integrated graphics, which is a step down from earlier Intel-based models that did include an iGPU. However, even this year's model (the DS925+) does not include an iGPU with its slightly newer AMD Ryzen Embedded V1500B CPU, but also unhelpfully locks down what you can use in it. All 2025 models require hardware from Synology's own compatibility list, this currently does not affect the DS923+. In addition you are only getting dual 1 GB Ethernet with the DS923+, so you may need to factor in the cost of adding the 10 GbE PCIe network card, which sells for $110.99 on Newegg. Ultimately, deciding on a NAS device comes to down to your individual requirements. For example, more bays is not always better, especially once you factor in the price of hard drives. Those with more modest storage requirements may be better off with a 2-bay device. From my personal experience, DSM 7.2 is great, it's so great that I have installed it on my TerraMaster F4-424 Max. Finally, and perhaps more importantly many tinkerers would prefer building their own server which is definitely a cheaper option, but without the polish of a dedicated NAS. If you have no need to transcode video on the fly and want a four bay NAS device, then the DS923+ is a great solution for every other use case and I can highly recommend it. Synology DS923+ for $609.99 on Newegg (was $642.99) Enter coupon code SACET2369 for above price during checkout
    • I don't think it's childish, but I do think it would be ineffective. If I was addicted to social media I would just disable the extension when I wanted to visit the certain sites.
    • Did you copy SuperHands's post and just reword it 🤣
  • Recent Achievements

    • Conversation Starter
      Kavin25 earned a badge
      Conversation Starter
    • One Month Later
      Leonard grant earned a badge
      One Month Later
    • Week One Done
      pcdoctorsnet earned a badge
      Week One Done
    • Rising Star
      Phillip0web went up a rank
      Rising Star
    • One Month Later
      Epaminombas earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      529
    2. 2
      ATLien_0
      207
    3. 3
      +FloatingFatMan
      168
    4. 4
      Michael Scrip
      150
    5. 5
      snowy owl
      126
  • Tell a friend

    Love Neowin? Tell a friend!