2009-01-16 44 views
5

Một trang web sẽ hiển thị như sau: -trang đơn hiển thị, nhiều trang in vấn đề

  • Bob
  • Fred
  • John

Tuy nhiên khi người dùng (đó sẽ là tôi) in trang web Tôi muốn nhiều lần lặp lại của kết quả này với các biến thể nhỏ được in trên các trang riêng biệt: -

  • Bob
  • Fred
  • John

>page break here<

  • Bob
  • Fred
  • John

>page break here<

  • Bob
  • Fred
  • John

Trên thực tế nội dung trang là lớn hơn (mặc dù cũng trong một trang A4 tiêu chuẩn giá trị) và số lượng đầu ra trang là khoảng 20. Tôi muốn một giải pháp cross-trình duyệt thanh lịch nhưng cuối cùng là một giải pháp hoạt động trên Internet Explorer 7 là chấp nhận được.

Tôi đang sử dụng ASP.NET MVC với jQuery (mặc dù giải pháp JavaScript thẳng là tốt).

Chỉnh sửa: Kiểu trang-Break-XXX css sẽ là một phần của câu trả lời, nhưng tôi đặc biệt quan tâm đến phương tiện để tự động tạo HTML phiên bản in từ phiên bản màn hình. Lưu ý Tôi không muốn điều hướng đến trang 'thân thiện với máy in' và sau đó in trang đó. Tôi chỉ muốn nhấn nút in của trình duyệt và phép thuật xảy ra.

Trả lời

10

Ok, do đó có tính đến ý kiến ​​vv bài một cái gì đó của tôi như thế này:

Để dễ hiển thị ở đây, tôi đang sử dụng kiểu trang nhưng bạn có thể dễ dàng sử dụng các tham chiếu trang.

Tuyên bố phong cách sau:

<!-- media="print" means these styles will only be used by printing 
    devices --> 
<style type="text/css" media="print"> 
    .printable{ 
     page-break-after: always; 
    } 
    .no_print{ 
     display: none; 
    } 
</style> 
<!-- media="screen" means these styles will only be used by screen 
    devices (e.g. monitors) --> 
<style type="text/css" media="screen"> 
    .printable{ 
     display: none; 
    } 
</style> 
<!-- media types can be combined with commas to affect multiple devices --> 
<style type="text/css" media="screen,print"> 
    h1{ 
     font-family: Arial, Helvetica, sans-serif; 
     font-size: large; 
     font-weight: bold; 
    } 
</style> 

Sau đó, bạn sẽ cần phải làm một số nâng nặng theo quan điểm của bạn để có được HTML tìm kiếm một cái gì đó như thế này:

<!-- Intial display for screen --> 
<div class="no_print"> 
    <!-- Loop through users here using preferred looping/display method --> 
    <ul> 
     <li>Bob</li> 
     <li>Fred</li> 
     <li>John</li> 
    </ul> 
</div> 
<!-- Now loop through each user, highlighting as you go, but for printer* --> 
<div class="printable"> 
    <ul> 
     <li><b>Bob</b></li> 
     <li>Fred</li> 
     <li>John</li> 
    </ul> 
</div> 
<div class="printable"> 
    <ul> 
     <li>Bob</li> 
     <li><b>Fred</b></li> 
     <li>John</li> 
    </ul> 
</div> 
<div class="printable"> 
    <ul> 
     <li>Bob</li> 
     <li>Fred</li> 
     <li><b>John</b></li> 
    </ul> 
</div> 

Bây giờ cho một "phương pháp hiển thị thích hợp".

Tôi chỉ bắt đầu với MVC, vì vậy bạn đã có thể có một phương pháp tốt hơn để làm điều này, nhưng bây giờ tôi có thể sử dụng một phương pháp renderPartial như thế này:

<% 
    /* 
    Using RenderPartial to render a usercontrol, 
    we're passing in the Model here as the Model for the control, 
    depends on where you've stored your objects really, then we 
    create a new anonymous type containing the properties we want 
    to set. 
    */ 

    // Display the main list 
    Html.RenderPartial("~/Views/Shared/Controls/UserList.ascx", 
     ViewData.Model, 
     new {HighlightUser = null, IsPrintable = false}); 

    // Loop through highlighting each user 
    foreach (var user in ViewData.Model) 
    { 
    Html.RenderPartial("~/Views/Shared/Controls/UserList.ascx", 
     ViewData.Model, 
     new {HighlightUser = user, IsPrintable = true}); 
    } 
%> 

kiểm soát sử dụng của bạn sau đó có thể xử lý phần lớn màn hình, đặt lớp của các div chứa (hoặc bất kỳ phần tử nào bạn sử dụng) khi thích hợp và bolding lên người dùng dựa trên dữ liệu được truyền vào - như tôi đã nói, có thể là cách tốt hơn để thực hiện một phần công cụ. Rõ ràng, bạn có thể muốn hiển thị hoàn toàn khác nhau của người dùng để hiển thị và in ấn - tôi đoán bạn có thể thêm khá nhiều jQuery tốt đẹp ẩn và hiển thị các công cụ, vv, mà bạn đang thực sự sẽ hiển thị trên các bản in được hiển thị trên màn hình in ấn. Phiên bản, vì vậy bạn có thể muốn hai điều khiển người dùng differnt, và sau đó có thể lấy đi với không đi qua trong các tài sản IsPrintable.

Ngoài ra, khi nó đứng, điều này sẽ in một trang trống ở cuối, do kiểu trang "ngắt sau" trên tất cả các div - bạn có thể muốn lưu ý rằng bạn đang ở trên div cuối cùng và có một phong cách khác trên đó, trừ khi bạn có thông tin mà bạn muốn trên trang cuối cùng đó.

+0

Sau khi tôi đăng bài này, tôi đã không chắc chắn nếu tôi nên có chỉ cần chỉnh sửa câu trả lời trước đây của tôi, http://stackoverflow.com/questions/361802/is-it-ok-to-post-multiple-answers-to-a -question đã không thực sự làm rõ. Nếu mọi người phản đối, tôi rất sẵn lòng kết hợp chúng và xóa mục này. –

+0

Tôi đã xóa +1 của tôi khỏi câu trả lời khác của bạn để bạn có thể xóa câu trả lời đó và giữ lại. Tôi đã quyết định vì những lý do khác mà tôi muốn giữ cho logic quyết định ai sẽ nhận được một bản sao trong bộ điều khiển. Do đó câu trả lời này là khá gần với những gì tôi cần. Cảm ơn. ;) – AnthonyWJones

+0

Bạn có thể thử điều này: $ ('. Printable: last-child'). Css ('page-break-after', 'avoid'); dunno nếu thuộc tính sẽ là trang ngắt sau. –

2

Tôi không chắc chắn bạn có thể làm tất cả thông qua CSS, nhưng đây là một số để giúp bạn bắt đầu.

Để có được một ngắt trang trong CSS khi in sử dụng một trong số:

Những mất giá trị của:

auto // Default. Insert a page break before/after the element if necessary 
always // Insert a page break before/after the element 
avoid // Avoid inserting a page break before/after the element 
left // Insert page breaks before/after the element until it reaches a blank left page 
right // Insert page breaks before/after the element until it reaches a blank right page 

Nếu bạn chuẩn bị để có một số loại "In" trang liệt kê các thông tin như bạn wa nt, với những phong cách trên các yếu tố lặp đi lặp lại, bạn nên được tốt để đi.

+0

Zhaph, cảm ơn đầu vào nhưng tôi không muốn điều hướng đến trang in.Tôi muốn một trang duy nhất xuất hiện khi trên màn hình và một trang khác được in. – AnthonyWJones

+0

page-break-xxxx chắc chắn là một phần của câu trả lời nhưng nó tạo ra các bản sao 'không hoàn toàn trùng lặp' của màn hình html mà tôi quan tâm. – AnthonyWJones

+0

Đó là nơi mà nó trở nên phức tạp. Rõ ràng, với một phương tiện truyền thông = "in" bạn có thể ghi đè lên các kiểu màn hình cho một máy in, nhưng tôi không chắc chắn nếu bạn có thể lặp lại các yếu tố của trang, nhưng với sự khác biệt mỗi lần. Có nhiều cách để tạo nội dung bằng css, ví dụ: http://www.w3schools.com/Css/pr_gen_content.asp –

1

Bạn sẽ cần thực hiện tất cả thông qua JavaScript, tạo liên kết in khi nhấp vào cuộc gọi window.print(). Tuy nhiên trước khi đó được gọi là tạo ra đầu ra mà bạn muốn và đặt nó vào một thùng chứa riêng biệt (div, span, bất kỳ phần tử html nào hỗ trợ các thẻ bạn sẽ đặt bên trong nó). Ẩn vùng chứa bằng biểu định kiểu chính của bạn và tạo biểu định kiểu riêng biệt cho phương tiện in. Trong biểu định kiểu mới này hiển thị phần tử vùng chứa và ẩn các phần tử cũ và bất kỳ thứ gì khác mà bạn không muốn in.

Nếu bạn muốn dọn sạch trang sau đó đặt khoảng thời gian bằng cách sử dụng SetInterval để xóa vùng chứa không mong muốn. Tôi sẽ không làm điều đó ngay lập tức sau khi gọi window.print() vì tôi tưởng tượng máy in sẽ không nhận các thay đổi HTML, tuy nhiên một thử nghiệm nhanh sẽ cho bạn biết cách khác.

Nếu có cách nghe bản in trang của bạn bằng javascript thì bạn cũng có thể kết nối nó.

Edit: Như bạn đang sử dụng jQuery tôi sẽ sao chép danh sách ban đầu bằng cách sử dụng

$('#listID').clone().appendTo('#hiddencontainer') 

Clone documentation

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