2012-12-12 22 views
7

Sau giải pháp SO here này để thông báo cho khách hàng về sự kiện nhấp trong tài liệu PDF, làm cách nào để thông báo cho khách hàng khi tệp PDF được khách hàng gửi bằng this.myPDF.submitForm ("localhost/Handler ? ashx r = 2) chức năngPDF hostContainer callback

file PDF được tạo ra bên trong một điều khiển người dùng sau đó trả lại vào một đối tượng HTML:

string container = ("<object data='/myfile.pdf' type='application/pdf'></object>"); 

các tập tin JS gắn liền với PDF được thực hiện như thế này:

var webClient = new WebClient(); 
string htmlContent = webClient.DownloadString(fileurl + "pdf_script.js"); 
PdfAction action = PdfAction.JavaScript(htmlContnent, pdfstamper.Writer); 
pdfstamper.Writer.SetOpenAction(action); 

Và nội dung của tập tin js:

this.disclosed = true; 
if (this.external && this.hostContainer) { 

function onMessageFunc(stringArray) { 
    try { 
      this.myPDF.submitForm("http://localhost/Handler.ashx?EmpNo=12345" + "#FDF", false); 

     } 
     catch (e) { 

     } 
    } 
    function onErrorFunc(e) { 
     console.show(); 
     console.println(e.toString()); 
    } 
    try { 
     if (!this.hostContainer.messageHandler); 
     this.hostContainer.messageHandler = new Object(); 
     this.hostContainer.messageHandler.myPDF = this; 
     this.hostContainer.messageHandler.onMessage = onMessageFunc; 
     this.hostContainer.messageHandler.onError = onErrorFunc; 
     this.hostContainer.messageHandler.onDisclose = function() { return true; }; 
    } 
    catch (e) { 
     onErrorFunc(e); 
    } 
} 

Khi cuộc gọi submitForm được thực hiện các nội dung PDF (trường mẫu) được lưu thành công và một cảnh báo sẽ được hiển thị trong PDF bằng cách làm này:

message = "%FDF-1.2 
        1 0 obj 
        << 
        /FDF 
        << 
         /Status("Success!") 
        >> 
        >> 
        endobj 
        trailer 
        <</Root 1 0 R>> 
      %%EOF"); 
return message; 

Điều tôi đang cố gắng làm là gửi PDF để gọi lại máy khách sau khi gửi biểu mẫu được gửi từ khách hàng này, một cách để xác nhận khách hàng rằng biểu mẫu đã được gửi, chứ không phải dưới dạng cảnh báo, nhưng thay vào đó, một cách để kích hoạt một hàm trong máy chủ (vùng chứa, khung nội tuyến, đối tượng ... v.v.).

+1

Tôi thiếu một số thông tin liên quan đến bước này: "Khi cuộc gọi submitForm được thực hiện, tệp PDF được tạo thành công và cảnh báo được hiển thị trong PDF bằng cách thực hiện việc này:". Tôi cho rằng một tệp PDF được tạo trên máy chủ và được hiển thị trên máy khách, nhưng có thể tôi đã sai. Có thể máy chủ đang trả về tệp FDF. Bạn có thể làm rõ? –

+1

Rất tiếc, lỗi của tôi, cuộc gọi submitForm được thực hiện để LƯU nội dung của tệp PDF không tạo, nó đã được hiển thị trong điều khiển người dùng và được nhúng vào một lời xin lỗi , tôi đã sửa câu hỏi và thêm chi tiết về cách PDF được hiển thị – Maya

+0

Tôi không hiểu ở trên nơi được nói "if (! this.hostContainer.messageHandler);" Tại sao dòng đó có dấu chấm phẩy ở cuối? Đây có phải là lỗi không? nếu không, mục đích của dòng đó là gì? cảm ơn nhiều! –

Trả lời

5

Phản hồi FDF bạn đã sử dụng không được biết đến với tôi, vì vậy tôi đã học được điều gì mới từ câu hỏi của bạn. Tôi đã nghiên cứu Tài liệu tham khảo AcroJS và đặc tả FDF trong Tài liệu tham khảo PDF và giờ đây tôi đã hiểu rõ hơn về mã của bạn. Cảm ơn vì điều đó.

Tôi giả sử rằng bạn đã biết cách kích hoạt thông báo JavaScript trong tệp HTML bằng cách sử dụng cuộc gọi JavaScript từ PDF. Xem createMessageHandler() trong bài viết JavaScript Communication between HTML and PDF.

Tôi giải thích câu hỏi của bạn là: "Làm cách nào để gọi phương thức này sau khi gửi thành công dữ liệu?"

Nếu có giải pháp cho câu hỏi này, nó sẽ liên quan đến JavaScript. Tôi thấy rằng người ta có thể thêm JavaScript vào một tệp FDF, nhưng tôi không chắc liệu JavaScript đó có thể 'nói chuyện với' HTML hay không. Tôi không chắc liệu bạn có thể gọi hàm JavaScript trong tệp PDF ban đầu của bạn từ phản hồi FDF hay không. Nếu có thể, bạn nên thêm một mục JavaScript vào tệp PDF của bạn tương tự như mục nhập/Trạng thái.

Giá trị của cụm từ này là một cuốn từ điển, một cái gì đó như:

<< 
/Before (app.alert\("before!"\)) 
/After (app.alert\("after"\)) 
/Doc [/MyDocScript1, (myFunc1\(\)), 
     /MyDocScript2, (myFunc2\(\)) 
>> 

Trong trường hợp của bạn, tôi sẽ loại bỏ các phím/Trước và/Doc. Tôi không nghĩ rằng bạn cần họ, tôi muốn giảm từ điển để:

<< 
/After (talkToHtml\(\)) 
>> 

đâu talkToHtml() là một phương pháp đã trình bày trong PDF:

function talkToHtml() { 
    var names = new Array(); 
    names[0] = "Success!"; 
    try{ 
     this.hostContainer.postMessage(names); 
    } 
    catch(e){ 
     app.alert(e.message); 
    } 
} 

Tôi không biết nếu điều này sẽ công việc. Tôi chưa bao giờ thử nó. Tôi đang dựa vào câu trả lời của tôi về thông số kỹ thuật.

Tôi không biết liệu bạn có thực sự cần sử dụng FDF hay không. Bạn đã thử thêm JavaScript vào phương thức submitForm() chưa?Một cái gì đó như:

this.myPDF.submitForm({ 
    cURL: "http://localhost/Handler.ashx?EmpNo=12345", 
    cSubmitAs: "FDF", 
    oJavaScript: { 
     Before: 'app.alert("before!")', 
     After: 'app.alert("after")', 
     Doc: ["MyDocScript1", "myFunc1()", 
       "MyDocScript2", "myFunc2()" ] 
    } 
}); 

Điều này sẽ chỉ hoạt động nếu bạn gửi dưới dạng FDF. Tôi không nghĩ rằng có một giải pháp nếu bạn gửi một chuỗi truy vấn HTML.

Trong trường hợp bạn đang tự hỏi điều gì MyDocScript1MyDocScript2 là:

Doc định nghĩa một mảng xác định thêm các kịch bản JavaScript để có bổ sung vào đối tượng quy định tại mục JavaScript của tên từ điển của tài liệu. Mảng này chứa một số phần tử chẵn, được sắp xếp theo từng cặp . Phần tử đầu tiên của mỗi cặp là tên và số thứ hai là chuỗi văn bản hoặc luồng văn bản xác định tập lệnh tương ứng với tên đó. Mỗi tập lệnh được xác định sẽ được thêm vào những tập lệnh đã được định nghĩa trong tên từ điển đã được định nghĩa trong từ điển tên và sau đó được thực thi trước tập lệnh được xác định trong mục Trước khi thực thi. (ISO-32000-1 Bảng 245)

Tôi không chắc chắn nếu tất cả điều này sẽ hoạt động trong thực tế. Xin vui lòng cho tôi biết một trong hai cách.

+0

Cuối cùng, thao tác này thực tế, client PDF có thể nói cả hai cách, trong trường hợp bạn muốn cập nhật câu trả lời, tôi phải sửa đổi/Sau dòng là:/JavaScript <>. Cảm ơn, bạn đã nhận được tiền thưởng! – Maya