2010-03-04 3 views
8

Ich habe einen HTML-Bericht, wobei jede Druckseite von einem <div class="page"> enthalten ist. Die Seite-Klasse wird alsExtra leere Seite beim Konvertieren von HTML in PDF mit abcPDF

definiert
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; 

Nach ein paar Änderungen an meinen Bericht Inhalt zu machen, wenn ich ABCpdf rufen Sie den Bericht in PDF zu konvertieren, plötzlich nach jeder realen Bericht Seite eingefügt ich eine leere Seite bekommen. Ich möchte die Änderungen, die ich gerade vorgenommen habe, nicht rückgängig machen. Daher hoffe ich, dass jemand weiß, warum die zusätzlichen Seiten eingefügt werden.

Antwort

7

Ich habe das gleiche genaue Problem erlebt. die leere Seite ist aufgrund der Seiten-Break-After: immer; in der CSS. Nicht nur ABCpdf, sondern auch das gedruckte wird eine zusätzliche Seite ausspucken. So habe ich den folgenden Code verwendet, um die letzte Seite zu entfernen: MyDoc.Delete (MyDoc.Page);

Dies führt jedoch zu einer anderen Art von Problem. Auf dem Entwicklungsserver, der IE 8 hat, bekomme ich eine extra leere Seite und bei der Produktion, wo ich IE6 habe, bekomme ich keine extra leere Seite. Also habe ich dem Support-Team von websupergoo eine E-Mail geschickt, um mir eine Möglichkeit zu zeigen, nach einer leeren Seite zu suchen. Die Idee besteht darin, eine PDF zu durchlaufen und alle leeren Seiten zu identifizieren und sie mit der obigen Logik zu löschen.

Und ich zweite Jakkwylde Meinung. WebSupergoo Leute sind sehr hilfreich und reagieren schnell. Ich hatte ein anderes Problem mit ABCpdf, um unter 64 Bit zu arbeiten und hatte fast einen Tag damit verbracht, es herauszufinden. Sie stellten mir mehrere Szenarien zur Verfügung, die ich ausprobieren konnte. Ihre Unterstützung war direkt auf das Geld und ich habe meine App in wenigen Minuten zum Laufen gebracht.

+0

das gleiche Problem mit verschiedenen IE-Versionen auf unterschiedliche Umgebungen haben. Ich folge dem gleichen Ansatz und es hat bisher gut für mich funktioniert. –

+0

Suchen Sie nach dem Code, den ich unten gepostet habe, um leere Seiten zu entfernen. –

1

Ich fand abcPDF seltsam und unberechenbar. Davon abgesehen, kann die Kombination aus Seitengröße und Seitenumbrüche die Ursache sein. Verringern Sie die Seitenhöhe und/oder entfernen Sie den Seitenumbruch.

2

Eine Sache, die einen erneuten Besuch wert ist, ist die Gültigkeit Ihres HTML-Markups, wenn Sie die Methode AddImageUrl verwenden. Instanzen, in denen die gerenderte PDF-Datei nicht wie erwartet aussieht, können durch schlechte Markup-, busted-Tags usw. verursacht werden.

Für was es wert ist, WebSuperGoo hat eine hervorragende Unterstützung und reagiert sehr gut, wenn Sie auf Anomalien stoßen. Oft können sie eine Arbeit raten oder Alternativen zu Ihrer Implementierung bereitstellen, wenn Sie ihnen Ihren Quellcode senden.

0

Kush ist richtig in der "Ich habe das gleiche genaue Problem erlebt. Die leere Seite ist wegen der Seite-Break-After: immer; in der CSS. Nicht nur ABCpdf, sondern auch gedruckt eine zusätzliche Seite ausspucken . "

Wenn ein div hat "page-break-after: immer" IE wird buchstäblich immer eine neue Seite beginnen, und wenn nichts hinzugefügt wird, wird es nur leer drucken. Firefox nicht.

abcpdf verwendet die IE8s-Rendering-Engine und erstellt als solche eine leere Seite. Für die Zwecke des OP sollte nur eine explizite Höhe das Problem lösen, und die Suchmaschine fügt die Seitenumbrüche für Sie ein.

Ich versuche, ein ähnliches Problem zu lösen, wo ich die Höhe nicht explizit festlegen kann, weil manchmal der Inhalt 2 Seiten dauern kann. (Jede Seite entspricht einer Person, und jede Person sollte beim Drucken auf einer neuen Seite beginnen). Ich habe auch abcpdf gemailt, um zu sehen, ob sie einen Hack-Fix haben, um die leere Seite zu finden, aber war neugierig, ob jemand das zugrunde liegende Problem beheben kann und css hack IE8, damit die letzte Seite nicht leer gedruckt wird. Ich schätze, das ist nicht möglich, aber ich wollte sicherstellen, dass ich nicht etwas Offensichtliches verpasse.

0

Die AddImageURL() Methode von ABCPDF ist locker Bind-Methode, die HTML nicht fest in erforderlichen Bereich, der neue leere Seite verursacht.

versuchen AddImageHTML() Methode zu verwenden, um Ihren gewünschten HTML-Code in PDF zu konvertieren ..

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(); 

Es wird immer genaue Ergebnisse liefern.

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

Dies funktioniert nicht, wenn nur Bilder auf einer Seite vorhanden sind. – socketman

0

Um Seitenumbrüche auf der letzten Seite zu vermeiden, habe ich so etwas gemacht und es hat funktioniert.

Ich stellte sicher, dass die letzte Seite nicht die Seitenumbruch hatte: immer kann dies mit jedem Templating oder Front-End-Framework wie angularJS getan werden, aber für dieses Beispiel verwende ich Blade Templating (aber alle php zu tun ...)

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

und dann habe ich in meinem Stylesheet

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

.last-page { 
    page-break-after:avoid; 
}