2009-12-30 69 views
5

Trong tham chiếu đến một bài trước đó (PDF Report generation)Chuyển đổi HTML sang PDF

tôi đã quyết định sử dụng một giải pháp tương tự để http://www.alistapart.com/articles/boom

Đối với những người bạn của những người không muốn đọc hoặc tham khảo - Tôi tạo báo cáo và cần báo cáo dưới dạng PDF. Tôi đã quyết định chuyển HTML -> PDF bằng cách sử dụng .NET.

Vì vậy, giả sử tôi nhận được tệp HTML chính xác như tôi muốn. Cách tốt nhất để chuyển đổi trang đã nói thành PDF là gì? Về bản chất, tôi muốn người dùng thấy "bản xem trước" trong HTML và sau đó có thể chuyển đổi trang đã nói thành PDF. Thư viện mà tôi hiện đang thử nghiệm là ABCPdf.

Suy nghĩ đầu tiên của tôi là lưu trang vào hệ thống tệp và tham chiếu URL của nó trong thường trình chuyển đổi trong một trình xử lý sự kiện trên chính trang đó. Điều này có vấn đề bởi vì tôi phải lưu trang mỗi lần nó được chuẩn bị để in nó. Trên thực tế, nó chỉ có vẻ backasswards. Ý tưởng tiếp theo của tôi là sử dụng phương thức hiển thị của trang để nắm bắt trang dưới dạng một luồng trực tiếp và sử dụng điều này (vì ABCPdf hỗ trợ chuyển đổi luồng HTML.) Nếu đây là câu trả lời của tôi, tôi bị mất cách kéo thực tế nó đi. Có một nút "In" mà xử lý không một Me.Render() để bytestream và gửi cho thói quen chuyển đổi? Điều đó thậm chí có thể?

Dòng dưới cùng - Khi trang được hiển thị bằng HTML đẹp, bạn khởi tạo chuyển đổi sang PDF của trang đó như thế nào? Giải pháp và các giải pháp khác được hoan nghênh.

Tôi hy vọng tôi là thiếu một cái gì đó rõ ràng như thế này đã có được "phần dễ dàng"

+1

Ngoài ra, tôi đang đùa giỡn với ý tưởng lưu mẫu HTML của trang trong DB và điền dữ liệu theo chương trình. Bằng cách đó, tôi có HTML mà tôi có thể làm bất cứ điều gì tôi muốn với (render để màn hình hoặc chuyển đổi) – IniTech

Trả lời

3

Ok, làm cho nó hoạt động - và nó khá đơn giản. Chỉ cần vượt qua điều này cùng với người tiếp theo có thể cần câu trả lời. Tôi vừa sử dụng thuộc tính Url của trang và gửi nó đến phương thức ABCPdf addImageUrl(). Cũng phải sử dụng chuỗi vì nó có nhiều hơn một trang. Cám ơn vì tất cả sự giúp đỡ.

Dim oPdfDoc As New Doc() 
Dim iPageID As Int32 
Dim MyUrl = Request.Url 

iPageID = oPdfDoc.AddImageUrl(MyUrl.AbsoluteUri) 

While True 
    oPdfDoc.FrameRect() 
    If Not oPdfDoc.Chainable(iPageID) Then 
     Exit While 
    End If 
    oPdfDoc.Page = oPdfDoc.AddPage() 
    iPageID = oPdfDoc.AddImageToChain(iPageID) 
End While 

For i as Int32 = 1 To oPdfDoc.PageCount 
    oPdfDoc.PageNumber = i 
    oPdfDoc.Flatten() 
Next 

oPdfDoc.Save(Server.MapPath("test.pdf")) 
oPdfDoc.Clear() 
-2

Làm thế nào để bạn làm điều đó từ C#? Bạn không (trực tiếp).

Tạo công nhân PRINCE.EXE có thể là lựa chọn duy nhất của bạn.

PRINCE.EXE sẽ đọc/ghi dữ liệu từ "đầu vào tiêu chuẩn" HTML và gửi PDF tới "đầu ra chuẩn". Sử dụng dòng lệnh "% dir% \ PRINCE -" không có tên tệp đầu ra.

Bạn có thể thấy bạn cần một thành phần COM riêng biệt để sinh ra PRINCE, vì lớp System.Management có thể không hoạt động cho bạn. Sử dụng Visual Basic hoặc C++ để tạo thành phần COM của bạn.

Đặt HTML trong cơ sở dữ liệu là một ý tưởng tồi nói chung, nhưng có thể không sao trong trường hợp của bạn, vì có vẻ như nó cơ bản là tĩnh.

EDIT

Đã thay đổi "con PRINCE.EXE" thành "công nhân PRINCE.EXE process". Tôi có một cảm giác vui nhộn rằng PRINCE.EXE không cần phải là một tiến trình con.

1

tôi ở trong hoàn cảnh tương tự như bạn và sau khi đánh giá rất nhiều tùy chọn bao gồm iTextSharp và ABC PDF, tôi đã kết thúc với wkhtmltopdf: http://code.google.com/p/wkhtmltopdf/.