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.
- Đă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ủ.
- Đả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).
- Cài đặt Adobe Reader trên máy chủ.
- 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".
- Đă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.
- 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.
- 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")
- 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
- 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).
- Thêm quyền cho FaxServiceUser đó vào bất kỳ thư mục nào cần đọc/ghi/xóa từ/đến.
- 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.
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. –
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(); } –