HTML aus ZIP-Archiv in PDF konvertieren – C#-Beispiel
In diesem Artikel erstellen wir einen benutzerdefinierten Message Handler für eine bestimmte Aufgabe – die Konvertierung von HTML aus einem ZIP-Archiv in PDF.
Es gibt viele Gründe, warum Sie HTML aus einem ZIP-Archiv in das PDF-Format konvertieren möchten. PDF bietet viele Vorteile, die andere Dateien nicht haben. Zum Beispiel unterstützen viele Programme und Anwendungen PDF-Dokumente, die meisten Webbrowser wie Chrome und Firefox können PDF-Dateien anzeigen. PDF-Dateien sind für den Druck optimiert; sie sind ideal für die Erstellung physischer Kopien Ihrer Dokumente. PDF unterstützt viele Komprimierungsalgorithmen. Sie können die Sicherheitseinstellungen für Ihre PDF-Datei konfigurieren, usw.
Erstellen eines benutzerdefinierten Nachrichten-Handlers
Aspose.HTML for .NET bietet Funktionen für die Erstellung benutzerdefinierter Nachrichten-Handler. Lassen Sie uns einen benutzerdefinierten Handler entwerfen, den wir für die Arbeit mit ZIP-Archiven verwenden können. Führen Sie die folgenden Schritte aus:
Verwenden Sie den erforderlichen Namespace, nämlich Aspose.Html.Net. Dieser Namespace wird durch Klassen und Schnittstellen dargestellt, die für eine einfache Netzwerkverarbeitung verantwortlich sind.
Um einen benutzerdefinierten Message Handler zu erstellen, müssen Sie Ihre eigene Klasse definieren, die von der Klasse MessageHandler abgeleitet wird. Die Klasse MessageHandler stellt einen Basistyp für Message-Handler dar. Die Vererbung von IDisposable ist notwendig, um einen Mechanismus für die deterministische Freigabe von nicht verwalteten Ressourcen bereitzustellen.
1using Aspose.Html.Net;
2...
3
4 class ZipArchiveMessageHandler : MessageHandler, IDisposable
5 {
6 }
Sie haben also Ihre eigene ZipArchiveMessageHandler-Klasse definiert, nun müssen Sie einige Operationen darin durchführen.
Initialisieren Sie eine Instanz der Klasse ZipArchiveMessageHandler und definieren Sie eine Filter-Eigenschaft für sie.
Überschreiben Sie die Methode Invoke() der Klasse MessageHandler, um das Verhalten des benutzerdefinierten Nachrichten-Handlers zu implementieren.
1// Implement ZipArchiveMessageHandler in C#
2
3// This message handler prints a message about start and finish processing request
4class ZipArchiveMessageHandler : MessageHandler, IDisposable
5{
6 private string filePath;
7 private Archive archive;
8
9 // Initialize an instance of the ZipArchiveMessageHandler class
10 public ZipArchiveMessageHandler(string path)
11 {
12 this.filePath = path;
13 Filters.Add(new ProtocolMessageFilter("zip"));
14 }
15
16 // Override the Invoke() method
17 public override void Invoke(INetworkOperationContext context)
18 {
19 // Call the GetFile() method that defines the logic in the Invoke() method
20 byte[] buff = GetFile(context.Request.RequestUri.Pathname.TrimStart('/'));
21 if (buff != null)
22 {
23 // Checking: if a resource is found in the archive, then return it as a Response
24 context.Response = new ResponseMessage(HttpStatusCode.OK)
25 {
26 Content = new ByteArrayContent(buff)
27 };
28 context.Response.Headers.ContentType.MediaType = MimeType.FromFileExtension(context.Request.RequestUri.Pathname);
29 }
30 else
31 {
32 context.Response = new ResponseMessage(HttpStatusCode.NotFound);
33 }
34
35 // Call the next message handler
36 Next(context);
37 }
38
39
40 byte[] GetFile(string path)
41 {
42 path = path.Replace(@"\", @"/");
43 ArchiveEntry result = GetArchive().Entries.FirstOrDefault(x => path == x.Name);
44 if (result != null)
45 {
46 using (Stream fs = result.Open())
47 using (MemoryStream ms = new MemoryStream())
48 {
49 fs.CopyTo(ms);
50 return ms.ToArray();
51 }
52 }
53 return null;
54 }
55
56 Archive GetArchive()
57 {
58 return archive ??= new Archive(filePath);
59 }
60
61 public void Dispose()
62 {
63 archive?.Dispose();
64 }
65}
Schauen wir uns dieses Codeschnipsel einmal genauer an:
Zunächst einmal muss der benutzerdefinierte ZipArchiveMessageHandler von der Basisklasse MessageHandler erben. Er hat zwei Variablen: das Archiv und die String-Darstellung des Pfads zum Archiv.
Der Message Handler verfügt über das Konzept der Filterung. In diesem Fall wird ein Protokoll-(Schema-)Filter hinzugefügt; dieser Nachrichten-Handler arbeitet nur mit dem
"zip"
-Protokoll. Das heißt, wenn die Ressource ein"zip"
-Protokoll hat, dann wird sie von ZipArchiveMessageHandler verarbeitet.Filtering messages by resource protocol is implemented using the ProtocolMessageFilter class. The ProtocolMessageFilter() constructor initializes a new instance of the ProtocolMessageFilter class. It takes the
"zip"
protocols as a parameter.Die Methode Invoke() implementiert das Verhalten von Nachrichten-Handlern. Sie wird für jeden Handler in der Pipeline aufgerufen und nimmt einen
context
als Parameter an. Die Methode GetFile() definiert die Logik der Methode Invoke(). Sie implementiert die Aufgabenkette, nach der der nächste Next(context
) Handler aufgerufen wird. Die GetFile()-Methode realisiert eine Suche nach Daten als Byte-Array in einem Zip-Archiv auf der Grundlage von Request und Formulare Response.context
provides contextual information for network services, the entity of the operation is passed through it, and the result of the operation is returned. In Aspose.HTML, thecontext
is realized by INetworkOperationContext interface that has two properties (parameters) – Request and Response. Request gets or sets the request message, Response gets or sets the response message. The Request contains information for a web request, for example, a URL – a path to a resource, headers, etc. The Response contains the response that the endpoint (Internet) returned.
Sie können die vollständigen Beispiele und Datendateien von GitHub herunterladen.
Hinzufügen von ZipArchiveMessageHandler in die Pipeline
Sie müssen nun ZipArchiveMessageHandler in die Pipeline aufnehmen. Verwenden Sie die Methode Add(), die ein “Zip”-Objekt als Parameter annimmt und ZipArchiveMessageHandler am Ende der Sammlung von Nachrichten-Handlern hinzufügt.
Die Eigenschaft INetworkService.MessageHandlers liefert eine Liste von MessageHandler-Instanzen, die bei der Ausführung einer RequestMessage aufgerufen werden.
1// Convert HTML from a ZIP archive to PDF using C#
2
3// Add this line before you try to use the 'IBM437' encoding
4System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
5
6// Prepare path to a source zip file
7string documentPath = Path.Combine(DataDir, "test.zip");
8
9// Prepare path for converted file saving
10string savePath = Path.Combine(OutputDir, "zip-to-pdf.pdf");
11
12// Create an instance of ZipArchiveMessageHandler
13using ZipArchiveMessageHandler zip = new ZipArchiveMessageHandler(documentPath);
14
15// Create an instance of the Configuration class
16using Configuration configuration = new Configuration();
17
18// Add ZipArchiveMessageHandler to the chain of existing message handlers
19configuration
20 .GetService<INetworkService>()
21 .MessageHandlers.Add(zip);
22
23// Initialize an HTML document with specified configuration
24using HTMLDocument document = new HTMLDocument("zip:///test.html", configuration);
25
26// Create the PDF Device
27using PdfDevice device = new PdfDevice(savePath);
28
29// Render ZIP to PDF
30document.RenderTo(device);
Im Beispiel enthält das ZIP-Archiv (test.zip) das HTML-Dokument (test.html), in dem alle zugehörigen Ressourcen Pfade relativ zum HTML-Dokument haben.
Hinweis: Der
HTMLDocument(address, configuration
) Konstruktor nimmt den absoluten Pfad zum ZIP-Archiv. Alle zugehörigen Ressourcen haben jedoch relative Pfade im HTML-Dokument und im Code des Beispiels.
Bitte lesen Sie den Artikel
Feinabstimmung von Konvertern, um mehr über die Umwandlung von HTML in PDF mit der Methode
RenderTo(device
) zu erfahren.
Aspose.HTML bietet einen kostenlosen Online- ZIP zu PDF Konverter, mit dem Sie schnell, einfach und übersichtlich HTML aus ZIP-Archiven in PDF konvertieren können. Dateien hochladen, konvertieren und in Sekundenschnelle Ergebnisse erhalten. Es ist keine zusätzliche Software erforderlich. Testen Sie unseren robusten Konverter jetzt kostenlos!