2017-09-30 19 views
16

Tôi đã nhìn thấy câu hỏi này được hỏi trước đây, nhưng tôi chưa thấy bất kỳ câu trả lời rõ ràng nào, và chắc chắn không phải là bất kỳ câu trả lời nào giải quyết được vấn đề của tôi. Tôi tạo ra một dịch vụ windows để gửi fax (bán tự động) bằng cách sử dụng FAXCOMEXLib livrary. Cho đến nay, dịch vụ của tôi đã thành công trong việc gửi các tệp văn bản (.txt). Nhưng khi tôi cố gắng gửi các tệp pdf, jpg hoặc tif, tôi nhận được lỗi "Thao tác không thành công". Trong SO, tôi đã thấy rất nhiều cuộc thảo luận về các quyền của người dùng mà dịch vụ đang chạy. Tôi đã thử nhiều tùy chọn khác nhau (Local Service, Local User, người dùng tùy chỉnh với đặc quyền quản trị viên, cho phép dịch vụ tương tác với máy tính để bàn). Nhưng dường như không có gì khác biệt. Dường như dịch vụ không có quyền mở ứng dụng thích hợp để "in" tệp pdf, jpg hoặc tif. Nhưng tôi chỉ suy đoán. Có ai đã thành công trong việc gửi fax qua FAXCOMEXLib trong dịch vụ Windows không? Đây là mã của tôi sẽ gửi bản fax:Tôi làm cách nào để gửi fax cho bản pdf từ Dịch vụ Windows bằng FAXCOMEXLib?

fileName = @"D:\temp\FaxTest.txt"; //THIS WORKS 
//fileName = @"D:\temp\FaxTest.pdf"; //Operation failed 
//fileName = @"D:\temp\FaxTest.tif"; //Operation failed 
faxDoc.Sender.Name = faxRec.From; 
faxDoc.Sender.Company = faxRec.From; 
faxDoc.Body = fileName; 
faxDoc.Subject = faxRec.ReferenceId; 
faxDoc.DocumentName = faxRec.ReferenceId; 
var to = "xxxxxxxxxx"; 
faxDoc.Recipients.Add(to, "Some Name"); 
var serverName = Environment.MachineName; 
string[] returnVal = faxDoc.Submit(serverName); 

Trong trường hợp bạn đang tự hỏi, vâng, các tập tin có tồn tại trên máy chủ với những cái tên đó, và họ là hồ sơ hợp lệ (tôi có thể mở chúng trong Adobe Reader và Trình xem ảnh). Và điều này cũng hoạt động tốt nếu tôi chạy cục bộ này trên máy tính dev của tôi. Và tất nhiên, người xem thích hợp bật lên trước khi gửi (trên máy cục bộ của tôi). Tôi đoán là vì lý do nào đó dịch vụ không thể mở trình xem. Có ai đã gửi thành công một tệp PDF theo cách này trong dịch vụ Windows không?

+0

kiểm tra yr FAXCOMEXLib phiên bản nào hỗ trợ? https://www.interfax.net/en/help/supported_file_types => Adobe Acrobat (Ver 9) hoặc thanh toán https://stackoverflow.com/a/988359/336511. có thể bạn cần chuyển pdf streem sang faxDoc. –

+0

FAXCOMLib.FaxServer fs = new FAXCOMLib.FaxServer(); FAXCOMLib.FaxDoc fd = newFAXCOMLib.FaxDoc(); int result = 0; fs = new FAXCOMLib.FaxServer(); fs.Connect ("FaxServer1"); fd = (FAXCOMLib.FaxDoc) fs.CreateDocument ("c: \\ documenttofax.pdf"); fd.RecipientName = "John Doe"; fd.FaxNumber = "555-1234"; thử { \t result = fd.Send(); } cuối cùng là { \t fs.Disconnect(); } –

Trả lời

1

Tôi muốn đưa ra câu trả lời hoàn chỉnh cho điều này.Các câu trả lời được đăng trước đây có một số giải pháp, nhưng họ không đưa ra một bức tranh hoàn chỉnh về mọi thứ chúng tôi phải làm để gửi thành công tệp pdf qua đường fax, sử dụng FAXCOMEXLib trong dịch vụ Windows tùy chỉnh của chúng tôi.

Tôi muốn bắt đầu điều này bằng cách nói rằng FAXCOMEXLib được tạo cho ứng dụng bảng điều khiển cửa sổ, không phải là dịch vụ cửa sổ. Bạn thậm chí có thể đọc điều này trong tài liệu. Và tôi nghĩ đó là lý do tại sao chúng tôi gặp rất nhiều rắc rối khi nó hoạt động.

Tuy nhiên, chúng tôi có thể làm cho nó hoạt động (cuối cùng) sau nhiều lần thử và lỗi. Hầu hết các vấn đề chúng ta gặp phải đều liên quan đến việc thiết lập và cho phép trong Adobe Reader. Những gì chúng tôi tìm thấy là Adobe Reader đã cố gắng thực hiện rất nhiều thứ đằng sau hậu trường khi xử lý tệp PDf. Và những "thứ" đó là cố gắng thực hiện tương tác của người dùng (nhấp vào các hộp cảnh báo, v.v.). Khi chạy dịch vụ này dưới dịch vụ Windows, không có tương tác người dùng nào từ dịch vụ đó, điều này khiến quá trình của chúng tôi treo vô thời hạn và cuối cùng là lỗi. Nhưng, chúng tôi thấy rằng có một cách xung quanh tất cả điều đó. Đây là cách chúng tôi đã làm điều đó:

Dưới đây là đoạn mã mà chúng ta đang sử dụng mà hoạt động:

fileName = @"D:\temp\FaxTest.pdf"; 
faxDoc.Sender.Name = faxRec.From; 
faxDoc.Sender.Company = faxRec.From; 
faxDoc.Body = fileName; 
faxDoc.Subject = faxRec.ReferenceId; 
faxDoc.DocumentName = faxRec.ReferenceId; 
var to = "xxxxxxxxxx"; 
faxDoc.Recipients.Add(to, "Some Name"); 
var serverName = Environment.MachineName; 
var myProcesses = Process.GetProcessesByName("AcroRd32"); 
foreach (var myProcess in myProcesses) 
{ 
    if (DateTime.Now.Ticks - myProcess.StartTime.Ticks > TimeSpan.FromSeconds(30).Ticks) { 
     myProcess.Kill(); 
    } 
} 
string[] returnVal = faxDoc.Submit(serverName); 

Có là mã hơn này trong dịch vụ của chúng tôi, tất nhiên. Các mã khác làm những việc như xử lý gọi lại xử lý sự kiện để theo dõi tình trạng gửi/hoàn thành/fax không thành công, vv Nhưng đây là "trái tim" của mã thực sự bắt đầu "gửi".

Và đây là danh sách các thay đổi cấu hình mà chúng tôi đã thực hiện cho máy chủ để làm cho dịch vụ Windows tùy chỉnh của chúng tôi giải mã, hiển thị và gửi tệp pdf đúng cách dưới dạng fax. Một số trong số này được liệt kê trong một số câu trả lời, nhưng một số thì không, và tôi muốn đây là một câu trả lời hoàn chỉnh.

  1. Đăng nhập với tư cách quản trị viên vào máy chủ và cài đặt vai trò Máy chủ Fax trên máy chủ.
  2. Đảm bảo thiết bị/modem modem fax được cài đặt đúng trên máy chủ và đường fax đang hoạt động. Bạn có thể chỉ cần gửi một vài bản fax thử nghiệm với các tệp văn bản trực tiếp từ tiện ích Windows Fax. (Trong trường hợp của chúng tôi, chúng tôi gặp phải vấn đề bởi vì chúng tôi đã phải quay số "9" và mật khẩu mật mã để nhận được một đường dài, bên ngoài).
  3. Cài đặt Adobe Reader trên máy chủ.
  4. Tạo người dùng trên máy chủ cho dịch vụ Windows của bạn để chạy "dưới dạng". Chúng tôi gọi người dùng của chúng tôi là "FaxServiceUser".
  5. Đăng nhập vào máy chủ với tư cách là FaxServiceUser này ít nhất một lần. Trong khi đăng nhập, hãy đặt thiết bị "Adobe PDF" làm máy in mặc định.
  6. Ngoài ra khi đã đăng nhập với tư cách người dùng này, hãy mở tệp PDF bằng Adobe và nhấp qua EULA.
  7. khi đăng nhập như người dùng này, và khi bạn có Adobe Reader mở, thay đổi các thiết lập này:
    • Nếu được chọn, bỏ đánh dấu "Chỉ cho tôi thông điệp khi tôi khởi động Reader" (Theo "General")
    • Bỏ chọn hộp kiểm "Bật chế độ bảo vệ" khi khởi động (Điều này chỉ có thể áp dụng cho Acrobat 10. Trong Acrobat 11, tùy chọn này đã được chuyển sang Bảo mật (Nâng cao) và có tiêu đề Bật chế độ bảo vệ khi khởi động. -kiểm tra tùy chọn này)
    • Bỏ chọn "Bật bảo mật nâng cao" (Trong "Bảo mật (Nâng cao)" - điều này chỉ có thể áp dụng cho Acrobat 11 trở lên)
    • Chọn tùy chọn Updater và tắt Tự động tải xuống và cài đặt bản cập nhật.
    • Un-kiểm tra "Tạo liên kết từ các URL" (Theo "General")
    • Un-kiểm tra "công cụ Thực hiện Hand đọc bài viết" (Theo "General")
    • Un-kiểm tra "Chỉ cho tôi thông điệp khi tôi khởi động reader "(Theo "General")
    • Un-kiểm tra "Tự động tính toán giá trị trường"(Theo "hình thức")
    • Un-kiểm tra "Hiển thị hình chữ nhật tập trung"(Theo "hình thức")
    • Un-kiểm tra" Hiển thị chỉ báo tràn trường văn bản "(Trong" Biểu mẫu ")
    • Bỏ chọn" Bật Acrobat JavaScript "(Trong" Javascript ")
    • Un-kiểm tra "Hiển thị hộp thoại chào mừng" (Theo "Rà soát")
    • Un-kiểm tra "kết nối Hiển thị máy chủ cảnh báo hộp thoại khi mở tập tin" (Theo "Rà soát")
  8. Nếu cần thiết, tham khảo ý kiến ​​này để hỗ trợ cài đặt Adobe Reader: http://kb.faxback.com/How+To+Configure+Adobe+XI+for+Use+with+NET+SatisFAXtion
  9. Sau khi xây dựng, triển khai và cài đặt dịch vụ Windows, hãy thay đổi thuộc tính của dịch vụ để chạy "dưới dạng" người dùng bạn đã tạo trước đó ("FaxServiceUser" trong trường hợp của chúng tôi).
  10. Thêm quyền cho FaxServiceUser đó vào bất kỳ thư mục nào cần đọc/ghi/xóa từ/đến.
  11. Vì Adobe có nghĩa là chạy dưới dạng ứng dụng dành cho máy tính, hãy thêm một số mã trong dịch vụ của bạn để phát hành bộ nhớ được Adobe Reader sử dụng (Bạn có thể xem chúng tôi đã thực hiện điều này như thế nào trong hàm myProcess.Kill() trong mã mẫu).

Và điều đó nên thực hiện. Đó là một chút cồng kềnh, nhưng tôi hy vọng điều này đưa ra một ví dụ hoàn chỉnh về cách thiết lập Adobe Reader kết hợp với dịch vụ Windows tùy chỉnh của bạn để gửi fax từ các tệp pdf trên máy chủ Windows. Chúng tôi đã làm điều đó trong một vài tháng nay mà không có vấn đề gì. Khách hàng của chúng tôi thực hiện một số lượng fax thấp, vì vậy tôi không thể nói về cách thức hoạt động của nó với một lượng lớn fax. Vì vậy, nếu bạn đang tìm kiếm một cách "miễn phí" để gửi fax, mà không phải trả tiền cho một cái gì đó như Interfax, điều này có thể là một lựa chọn khả thi, ít nhất là cho khối lượng thấp.

0

Sự cố có vẻ liên quan đến quá trình có tên "AcroRd32", mở fax trong Acrobat Reader và chuyển đổi tệp đó thành tệp TIFF trước khi gửi. Quá trình này không giải phóng bộ nhớ.

Cố gắng ngăn chặn quá trình này như sau

Dim myProcesses() As Process Dim myProcess As Process 
' How to retrieve the program associat with pdf, when i only know the file extension ? 
myProcesses = Process.GetProcessesByName("AcroRd32") For Each myProcess In myProcesses 
If Date.Now.Ticks - myProcess.StartTime.Ticks > TimeSpan.FromSeconds(30).Ticks Then 
myProcess.Kill() 
End If 
Next 

Tôi hy vọng điều này là hữu ích.

+0

Tôi phải thừa nhận, đây là lần đầu tiên tôi nghe về giải pháp này. Tôi sẽ cho nó một viên đạn. Hãy để tôi hỏi, điều này có xảy ra vì có người dùng khác đã đăng nhập và sử dụng Acrobat Reader không? –

+0

Windows chuyển đổi tài liệu sang TIFF trước khi gửi. Nó sẽ mở tài liệu dựa trên sự liên kết. Do đó, Adobe được bắt đầu bởi vì nó được liên kết với PDF. Tôi khuyên bạn nên đọc tài liệu của FAXCOMEXLib – Nawfel

+0

Cảm ơn @Nawfel, tôi nhận ra rằng nó sẽ mở ra bởi sự kết hợp. Bạn có thành công trong việc này không? –

3

Tài liệu được viết khá tốt trong the MSDN article. Điều không quan trọng cần phải xảy ra là một số phần mềm cần chuyển đổi nội dung tệp thành văn bản có thể in có thể fax. Trích dẫn:

Ví dụ về tài liệu bạn có thể gửi dưới dạng phần thân fax là tệp văn bản (.txt), tài liệu Microsoft Word (.doc) hoặc bảng tính Microsoft Excel (.xls). Khi bạn gửi fax từ máy khách, cơ thể phải được liên kết với một ứng dụng được cài đặt trên máy tính đó và ứng dụng phải hỗ trợ động từ PrintTo; nếu không, bản fax sẽ thất bại.

Vì vậy, một thử nghiệm đơn giản bạn có thể làm là nhấp chuột phải vào tệp trong Explorer và tìm lệnh "In". Tiếp theo kéo tập tin vào máy in để thực hiện động từ PrintTo. Nếu những thử nghiệm này thất bại thì nó sẽ không hoạt động và bạn cần phải cài đặt một ứng dụng biết cách in tệp.

Thực hiện việc này từ dịch vụ đặt thêm các yêu cầu đối với ứng dụng thực hiện việc in. Có rất nhiều người trong số họ không cư xử đặc biệt tốt trong một dịch vụ. Đặc biệt là khi bạn cố gắng in, Microsoft khuyên bạn không bao giờ nên làm điều đó trong một dịch vụ. Ứng dụng văn phòng không ví dụ như muộn, làm cho lời khuyên MSDN đã có nước sốt yếu.

Trên máy của tôi, tiện ích mở rộng .tif được liên kết với ứng dụng UWP, tính năng này cũng sẽ không hoạt động trong dịch vụ. Việc đưa ra lời khuyên tốt là khó khăn do số lượng lớn ứng dụng xử lý các tiện ích mở rộng phổ biến này, tốt nhất là truy cập superuser.com và đặt tên cho tiện ích mở rộng cụ thể, phiên bản Windows và ứng dụng bạn muốn sử dụng. Làm điều này từ một phiên người dùng chắc chắn là ít phiền toái nhất.

+0

Cảm ơn bạn đã phản hồi @Hans. Có tùy chọn "In" khi nhấp chuột phải vào các tệp pdf. Và khi tôi chọn từ trình thám hiểm, nó sẽ tự động nhắc tôi "lưu dưới dạng tệp XPS". Suy nghĩ của tôi là tôi nên có một tùy chọn để "In tới máy in fax", đúng không? Điều đó có thể chỉ ra rằng máy in fax của tôi không được thiết lập chính xác không? Hoặc có lẽ Adobe Reader không hỗ trợ in trực tiếp? –

+0

Bạn cần đọc phần còn lại của bài đăng. Nhưng Adobe Reader, ugh bình phương, không nhìn xa hơn vì nguyên nhân của vấn đề này. Bạn nhận được những gì bạn trả tiền, và ít hơn. –

+0

Tôi đánh giá cao phản hồi @HansPassant. Nó có thể có một cái gì đó để làm với Adobe. Từ Windows Explorer, việc in và mở hoạt động tốt trên một tệp PDF (sử dụng Adobe làm ứng dụng được liên kết). Nhưng tôi chỉ nhận được lỗi "Thao tác không thành công" khi dịch vụ của tôi (hoặc thậm chí IIS) cố gắng fax. Chúng tôi sẵn sàng mua một sản phẩm sẽ làm điều này. Nhưng quản lý dự án của tôi là do dự với việc sử dụng một cái gì đó như Interfax. Anh ta không thích ý tưởng trả tiền trên cơ sở "cho mỗi fax". Nhưng việc mua một sản phẩm một lần không nằm ngoài câu hỏi. Tôi chỉ không thể tìm thấy bất kỳ. Bạn có biết nếu có sản phẩm nào không? –

Các vấn đề liên quan