2010-03-04 43 views
8

Tôi có một báo cáo HTML, với mỗi trang in có chứa <div class="page">. Lớp trang được định nghĩa làTrang trống bổ sung khi chuyển đổi HTML sang PDF bằng cách sử dụng abcPDF

width: 180mm; 
height: 250mm; 
page-break-after: always; 
background-position: centre top; 
background-image: url(Images/MainBanner.png); 
background-repeat: no-repeat; 
padding-top: 30mm; 

Sau khi thực hiện một vài thay đổi nội dung báo cáo của tôi, khi tôi gọi abcPDF để chuyển đổi báo cáo sang PDF, đột nhiên tôi nhận được một trang trống chèn sau mỗi trang báo cáo thực. Tôi không muốn khôi phục các thay đổi mà tôi vừa thực hiện để xóa vấn đề này, vì vậy tôi hy vọng ai đó có thể biết lý do tại sao các trang bổ sung đang được chèn vào.

Trả lời

7

Tôi đã gặp phải cùng một sự cố chính xác. trang trống là do page-break-after: luôn luôn; trong CSS. Không chỉ ABCpdf mà còn in sẽ nhổ ra một trang phụ. Vì vậy, tôi đã sử dụng mã sau đây để loại bỏ trang cuối cùng: MyDoc.Delete (MyDoc.Page);

Tuy nhiên, điều này dẫn đến một loại vấn đề khác. Trên máy chủ phát triển, trong đó có IE 8 tôi nhận được một trang trống thêm và vào sản xuất, nơi tôi có IE6, tôi không nhận được thêm trang trống. Vì vậy, tôi đã gửi email cho nhóm hỗ trợ tại websupergoo để chỉ cho tôi cách tìm một trang trống. Ý tưởng là để lặp qua một pdf và xác định tất cả các trang trống và xóa chúng bằng cách sử dụng logic trên.

Và tôi là ý kiến ​​thứ hai của Jakkwylde. Websupergoo folks cực kỳ hữu ích và nhanh chóng đáp ứng. Tôi đã có một vấn đề khác nhận được ABCpdf để làm việc dưới 64 bit và đã dành gần một ngày cố gắng tìm ra nó. Họ cung cấp cho tôi nhiều kịch bản mà tôi có thể thử. Sự hỗ trợ của họ là đúng về số tiền và tôi đã ứng dụng và chạy trong vài phút.

+0

đã cùng một vấn đề với các phiên bản IE khác nhau trên các môi trường khác nhau. Tôi làm theo cách tiếp cận tương tự và nó đã làm việc tốt cho tôi cho đến nay. –

+0

Tìm mã tôi đã đăng xuống dưới đây để xóa các trang trống. –

1

Tôi đã tìm thấy abcPDF là lạ và không thể đoán trước. Điều đó đang được nói, những gì có thể xảy ra là sự kết hợp giữa kích thước trang và ngắt trang có thể là thủ phạm. Giảm chiều cao trang của bạn và/hoặc xóa ngắt trang.

2

Một điều đáng xem lại là tính hợp lệ của đánh dấu HTML nếu bạn đang sử dụng phương pháp AddImageUrl. Các trường hợp trong đó PDF được hiển thị không như mong đợi có thể do đánh dấu không tốt, thẻ bị băm nhỏ, v.v.

Đối với những gì đáng giá, WebSuperGoo có hỗ trợ tuyệt vời và phản hồi tuyệt vời khi bạn gặp phải sự bất thường. Thông thường họ có thể tư vấn cho một công việc xung quanh hoặc cung cấp các lựa chọn thay thế cho việc triển khai của bạn nếu bạn gửi cho họ mã nguồn của bạn.

0

Kush là chính xác trong đó "Tôi đã gặp phải cùng một vấn đề chính xác. Trang trống là do trang-break-after: luôn luôn; trong CSS. Không chỉ ABCpdf mà còn in sẽ nhổ ra một trang phụ . "

Nếu div có "page-break-after: always", IE sẽ theo nghĩa đen luôn luôn bắt đầu một trang mới và nếu không có gì được thêm vào nó sẽ chỉ in trống. Firefox thì không.

abcpdf sử dụng công cụ hiển thị của IE8 và do đó tạo một trang trống. Đối với mục đích của OP, chỉ cần sử dụng một chiều cao rõ ràng nên giải quyết vấn đề, và động cơ sẽ chèn ngắt trang cho bạn.

Tôi đang cố giải quyết vấn đề tương tự, nơi tôi không thể đặt chiều cao một cách rõ ràng bởi vì đôi khi nội dung có thể mất 2 trang. (Mỗi trang tương ứng với một người, và mỗi người nên bắt đầu trên một trang mới khi in). Tôi cũng gửi email đến abcpdf để xem họ có sửa lỗi để phát hiện trang trống không, nhưng tò mò liệu có ai biết cách khắc phục sự cố cơ bản và css hack IE8 để làm cho nó không in trang cuối cùng nếu trống không. Tôi đoán nó là không thể, nhưng muốn chắc chắn rằng tôi không thiếu một cái gì đó hiển nhiên.

0

Phương pháp AddImageURL() của ABCPDF được liên kết lỏng lẻo với phương pháp không hiển thị html chặt chẽ trong khu vực bắt buộc gây ra trang trống mới.

cố gắng sử dụng AddImageHTML() phương pháp để chuyển đổi HTML của bạn mong muốn vào PDF ..

Doc theDoc = new Doc(); 
theDoc.Page = theDoc.AddPage(); 

int theID = 0; 
theDoc.SetInfo(0, "CheckBgImages", "1"); 
theDoc.SetInfo(0, "RenderDelay", "5000"); 
theDoc.HtmlOptions.Engine = EngineType.MSHtml; 
theID = theDoc.AddImageHtml(HTML); 

while (true) 
{ 
if (!theDoc.Chainable(theID)) 
       break; 
      theDoc.Page = theDoc.AddPage(); 
      theID = theDoc.AddImageToChain(theID); 
     } 

     for (int i = 0; i <= theDoc.PageCount; i++) 
     { 
      theDoc.PageNumber = i; 
      theDoc.Flatten(); 
     } 

     theDoc.Save(HttpContext.Current.Server.MapPath(Path)); 
     theDoc.Clear(); 

Nó sẽ luôn luôn cho kết quả chính xác.

2
protected void RemoveBlankPages(Doc pdf) 
{ 
    for (int i = pdf.PageCount; i > 0; i--) 
    { 
     pdf.PageNumber = i; 

     //get the pdf content 
     string textContent = pdf.GetText("Text"); 

     //delete the page if it is blank 
     if (string.IsNullOrEmpty(textContent)) 
      pdf.Delete(pdf.Page); 
    } 
} 
+1

Điều này sẽ không hoạt động nếu chỉ có hình ảnh trên một trang. – socketman

0

Để tránh phá vỡ trang ở trang cuối cùng, tôi đã làm một việc như thế này và hoạt động.

Tôi đảm bảo rằng trang cuối cùng không có trang ngắt sau: luôn luôn, điều này có thể được thực hiện với bất kỳ khuôn mẫu khuôn mẫu hoặc front-end nào như angularJS, nhưng ví dụ này tôi sử dụng mẫu templating (nhưng bất kỳ php sẽ làm ...)

@if ($last_page) 
    <div class='footer last-page'> 
@else 
    <div class='footer'> 

và sau đó tôi có điều này trong style sheet của tôi

.footer { 
    page-break-after:always; 
} 

.last-page { 
    page-break-after:avoid; 
} 
Các vấn đề liên quan