2015-11-29 13 views
6

Tôi có chương trình C# .net tạo nhiều tài liệu khác nhau. Những tài liệu này nên được lưu trữ ở các địa điểm khác nhau và với các tên khác nhau, được xác định rõ ràng.Đặt tên tệp và đường dẫn theo lập trình trong Microsoft Print sang máy in PDF

Để làm như vậy, tôi sử dụng lớp System.Drawing.Printing.PrintDocument. Tôi chọn máy in Microsoft Print to PDF làm bản sao kê này:

PrintDocument.PrinterSettings.PrinterName = "Microsoft Print to PDF";

Khi làm như vậy, tôi có thể in tài liệu của mình theo số pdf file. Người dùng nhận được hộp thoại chọn tệp. Sau đó, anh ta có thể chỉ định trong hộp thoại này tên của tệp pdf và nơi lưu trữ nó.

Vì số lượng tệp lớn và gây khó chịu và dễ bị lỗi luôn tìm đường dẫn và tên chính xác, tôi muốn đặt đường dẫn và tên tệp chính xác trong hộp thoại này theo lập trình.

Tôi đã thử nghiệm những thuộc tính này:

PrintDocument.PrinterSettings.PrintFileName PrintDocument.DocumentName

Viết con đường cần thiết và tên tập tin để những thuộc tính này đã không giúp đỡ. Có ai biết, làm thế nào để đặt giá trị mặc định cho đường dẫn và tên tệp cho máy in Microsoft Print to PDF trong C#?

Lưu ý: Môi trường của tôi: Windows 10, Visual Studio 2010, net framework 4.5

Trả lời

0

Nó có vẻ như các PrintFilename được bỏ qua nếu PrintToFile tài sản là không thiết lập để true. Nếu PrintToFile được đặt thành true và tên tệp hợp lệ (đường dẫn đầy đủ) được cung cấp, thì tệp nội dung mà người dùng chọn tên tệp sẽ không được hiển thị.

Mẹo: Khi đặt printername của printerettings, bạn có thể kiểm tra thuộc tính IsValid để kiểm tra xem máy in này có thực sự tồn tại hay không. Để biết thêm thông tin về máy in và tìm máy in được cài đặt check this post

0

Tôi đã tự mình thử nghiệm nhưng cũng giống như bản thân bạn cũng không thể điền trước hộp thoại SaveAs trong PrintDialog bằng DocumentName hoặc PrinterSettings.PrintFileName đã được điền vào cá thể PrintDocument. Điều này có vẻ phản trực giác, vì vậy có thể tôi thiếu một số thứ gì đó

Nếu bạn muốn, bạn có thể bỏ qua printdialog và in tự động mà không có bất kỳ tương tác người dùng nào. Nếu bạn chọn làm như vậy, bạn phải đảm bảo rằng thư mục mà bạn muốn thêm tài liệu vào đó tồn tại và tài liệu được thêm vào không tồn tại.

string existingPathName = @"C:\Users\UserName\Documents"; 
string notExistingFileName = @"C:\Users\UserName\Documents\TestPrinting1.pdf"; 

if (Directory.Exists(existingPathName) && !File.Exists(notExistingFileName)) 
{ 
    PrintDocument pdoc = new PrintDocument(); 
    pdoc.PrinterSettings.PrinterName = "Microsoft Print to PDF"; 
    pdoc.PrinterSettings.PrintFileName = notExistingFileName; 
    pdoc.PrinterSettings.PrintToFile = true; 
    pdoc.PrintPage += pdoc_PrintPage; 
    pdoc.Print(); 
} 
1

Như đã đề cập trong câu trả lời khác, bạn có thể buộc PrinterSettings.PrintToFile = true, và thiết lập các PrinterSettings.PrintFileName, nhưng sau đó người dùng của bạn không được lưu dưới dạng bật lên. Giải pháp của tôi là tiếp tục và hiển thị hộp thoại Lưu với tên của tôi, điền vào đó với tên tệp "được đề xuất" của tôi [trong trường hợp của tôi, một tệp văn bản (.txt) mà tôi thay đổi thành .pdf], sau đó đặt kết quả là PrintFileName.

DialogResult userResp = printDialog.ShowDialog(); 
if (userResp == DialogResult.OK) 
{ 
    if (printDialog.PrinterSettings.PrinterName == "Microsoft Print to PDF") 
    { // force a reasonable filename 
     string basename = Path.GetFileNameWithoutExtension(myFileName); 
     string directory = Path.GetDirectoryName(myFileName); 
     prtDoc.PrinterSettings.PrintToFile = true; 
     // confirm the user wants to use that name 
     SaveFileDialog pdfSaveDialog = new SaveFileDialog(); 
     pdfSaveDialog.InitialDirectory = directory; 
     pdfSaveDialog.FileName = basename + ".pdf"; 
     pdfSaveDialog.Filter = "PDF File|*.pdf"; 
     userResp = pdfSaveDialog.ShowDialog(); 
     if (userResp != DialogResult.Cancel) 
      prtDoc.PrinterSettings.PrintFileName = pdfSaveDialog.FileName; 
    } 

    if (userResp != DialogResult.Cancel) // in case they canceled the save as dialog 
    { 
     prtDoc.Print(); 
    } 
} 
Các vấn đề liên quan