{"id":55000356,"date":"2023-04-01T00:00:00","date_gmt":"2023-04-25T17:13:24","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=356"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"PDFs_aufteilen_und_zusammenfuegen_mit_NET","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/PDFs_aufteilen_und_zusammenfuegen_mit_NET\/","title":{"rendered":"PDFs aufteilen und zusammenf&uuml;gen mit .NET"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/e82466c0f0f54138885d19ed46b1a418\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Gelegentlich m&ouml;chte man PDF-Dateien bearbeiten &#8211; und das am besten ohne eigenes Zutun, sondern komplett programmgesteuert. Ein Kunde ist beispielsweise an mich herangetreten und wollte ein riesiges PDF-Dokument, das eine Menge Rechnungen in einer einzigen Datei enthielt, aufteilen. Als Ergebnis w&uuml;nscht er sich einzelne Dateien, die jeweils eine Rechnung enthielten. Grund genug, einmal zu schauen, wie man mit .NET an dieses Problem herangehen kann. Gen&uuml;gend NuGet-Pakete mit Funktionen zum Bearbeiten von PDF-Dokumenten sind verf&uuml;gbar, sodass wir die Qual der Wahl haben. F&uuml;r diese Aufgabe haben wir das NuGet-Paket PDFsharp herangezogen, das verspricht, mit PDF-Seiten umgehen zu k&ouml;nnen &#8211; egal, ob es um das Entfernen, Hinzuf&uuml;gen, Extrahieren oder Zusammenstellen neuer Dokumente geht.<\/b><\/p>\n<h2>Anforderungen an ein NuGet-Paket zum Analysieren und Bearbeiten von PDF-Dokumenten<\/h2>\n<p>Speziell auf die oben angegebene Aufgabenstellung bezogen k&ouml;nnen wir zwei Anforderungen definieren:<\/p>\n<ul>\n<li>Wir ben&ouml;tigen eine Funktion, mit der wir ein PDF-Dokument seitenweise durchlaufen und im Text der Seiten nach bestimmten Ausdr&uuml;cken suchen k&ouml;nnen. Diese Aufgabe erledigt PDFsharp nicht zufriedenstellend, daher schauen wir uns dazu in einem weiteren Artikel ein besser geeignetes Paket an.<\/li>\n<li>Au&szlig;erdem ben&ouml;tigen wir eine Funktion, mit der wir einzelne Seiten eines PDFs-Dokuments extrahieren und als eigenst&auml;ndige Dokumente speichern k&ouml;nnen.<\/li>\n<\/ul>\n<p>Beides w&uuml;rde theoretisch auch Adobe Acrobat Pro bieten, aber dies ist kostenpflichtig und wir sollen sehen, ob wir auch mit kostenloser Software weiterkommen.<\/p>\n<h2>NuGet-Paket suchen<\/h2>\n<p>Also starten wir Visual Studio und legen ein neues Projekt namens <b>PDFTools <\/b>an. Das Projekt soll den Typ <b>WPF-App (.NET Framework) <\/b>erhalten (siehe Bild 1), damit wir die Funktionen &uuml;ber eine Benutzeroberfl&auml;che steuern k&ouml;nnen &#8211; beispielsweise, um den Namen der zu bearbeitenden PDF-Datei anzugeben und die gew&uuml;nschten Funktionen aufzurufen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_356_001.png\" alt=\"Anlegen einer neuen WPF-Anwendung\" width=\"674,627\" height=\"335,1316\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Anlegen einer neuen WPF-Anwendung<\/span><\/b><\/p>\n<p>Nachdem das Projekt angelegt und ge&ouml;ffnet wurde, rufen wir den Men&uuml;befehl <b>Projekt|NuGet-Pakete verwalten&#8230; <\/b>auf. Dies &ouml;ffnet das Fenster <b>NuGet: PDFTools<\/b>, wo wir zum Bereich <b>Durchsuchen <\/b>wechseln.<\/p>\n<p>Hier geben wir einfach einmal den Suchbegriff <b>PDF <\/b>ein und erhalten direkt einige Treffer. Direkt der erste ist recht bekannt und hei&szlig;t <b>PDFsharp<\/b>. Interessant ist, dass es unter der MIT-Lizenz l&auml;uft. Die Bedingungen kannst Du mit einem Klick auf <b>Lizenz anzeigen <\/b>einsehen.<\/p>\n<p>Wir w&auml;hlen <b>PDFsharp <\/b>in der Version <b>Aktuellste stabile Version <\/b>aus und klicken auf <b>Installieren<\/b> (siehe Bild 2). Damit landen die ben&ouml;tigten Dateien im Projektverzeichnis und werden als Verweise eingebunden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_356_002.png\" alt=\"Hinzuf&uuml;gen einer PDF-Bibliothek\" width=\"649,627\" height=\"430,1474\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Hinzuf&uuml;gen einer PDF-Bibliothek<\/span><\/b><\/p>\n<h2>Funktion zum Ausw&auml;hlen des PDF-Dokuments hinzuf&uuml;gen<\/h2>\n<p>Bevor wir uns mit <b>PDFsharp <\/b>besch&auml;ftigen, f&uuml;gen wir der Startseite <b>MainWindow.xaml <\/b>schon einmal ein Textfeld zum Anzeigen und eine Schaltfl&auml;che zum Ausw&auml;hlen der zu untersuchenden und gegebenenfalls zu bearbeitenden PDF-Datei hinzu. Dazu definieren wir die Steuerelemente wie folgt (f&uuml;r den kompletten Code siehe Beispielprojekt im Download):<\/p>\n<pre>&lt;Label&gt;PDF-Dokument:&lt;\/Label&gt;\r\n&lt;StackPanel Orientation=\"Horizontal\" Grid.Column=\"1\"&gt;\r\n     &lt;TextBox x:Name=\"txtPDFDokument\"         Width=\"300\"&gt;&lt;\/TextBox&gt;\r\n     &lt;Button x:Name=\"btnDateiauswahl\"         Click=\"btnDateiauswahl_Click\"&gt;Ausw&auml;hlen&lt;\/Button&gt;\r\n&lt;\/StackPanel&gt;<\/pre>\n<p>F&uuml;r die Schaltfl&auml;che <b>btnDateiauswahl<\/b> hinterlegen wir die Prozedur aus Listing 1 in der Code behind-Datei <b>MainWindow.xaml.vb<\/b>. Diese Prozedur ruft einen Dialog zur Auswahl der zu bearbeitenden PDF-Datei auf.<\/p>\n<pre>Imports Microsoft.Win32\r\n<span style=\"color:blue;\">Class<\/span> MainWindow\r\n     <span style=\"color:blue;\">Private <\/span>Sub btnDateiauswahl_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n         <span style=\"color:blue;\">Dim <\/span>objFileDialog<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> OpenFileDialog()\r\n         objFileDialog.Filter = \"PDF-Dateien (*.pdf)|*.pdf|Alle Dateien (*.*)|*.*\"\r\n         objFileDialog.FilterIndex = 1\r\n         objFileDialog.RestoreDirectory = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">If <\/span>objFileDialog.ShowDialog() = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             txtPDFDokument.Text = objFileDialog.FileName\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End Sub\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: &Ouml;ffnen eines Dateiauswahl-Dialogs<\/span><\/b><\/p>\n<p>Zum Ausprobieren klicken wir auf <b>F5 <\/b>und sehen, dass alles wie gew&uuml;nscht funktioniert.<\/p>\n<h2>Seitenzahl eines PDF-Dokuments ermitteln<\/h2>\n<p>Zum Warmwerden wollen wir die Seitenzahl des ausgew&auml;hlten PDF-Dokuments ermitteln. Dazu f&uuml;gen wir eine neue Schaltfl&auml;che zum Code hinzu:<\/p>\n<pre>&lt;Button x:Name=\"btnSeitenzahl\" Grid.Row=\"1\"     Click=\"btnSeitenzahl_Click\"&gt;Seitenzahl&lt;\/Button&gt;<\/pre>\n<p>Die dadurch ausgel&ouml;ste Prozedur beantwortet gleich zwei Fragen: Wie kann ich &uuml;berhaupt ein PDF-Dokument f&uuml;r die Analyse und Bearbeitung mit <b>PDFsharp<\/b> &ouml;ffnen und wie finde ich die Seitenzahl des ge&ouml;ffneten Dokuments heraus?<\/p>\n<p>Bevor wir damit starten, f&uuml;gen wir der Klasse <b>MainWindow.xaml.vb <\/b>die folgenden weiteren beiden <b>Namespace<\/b>-Verweise hinzu:<\/p>\n<pre>Imports PdfSharp.Pdf\r\nImports PdfSharp.Pdf.IO<\/pre>\n<p>Danach schauen wir uns die Prozedur aus Listing 2 an.  Die Prozedur deklariert drei Variablen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnSeitenzahl_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     <span style=\"color:blue;\">Dim <\/span>strPfad<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objDocument<span style=\"color:blue;\"> As <\/span>PdfDocument\r\n     <span style=\"color:blue;\">Dim <\/span>intSeitenzahl<span style=\"color:blue;\"> As Integer<\/span>\r\n     strPfad = txtPDFDokument.Text\r\n     objDocument = PdfReader.Open(strPfad, PdfDocumentOpenMode.ReadOnly)\r\n     intSeitenzahl = objDocument.PageCount\r\n     <span style=\"color:blue;\">MsgBox<\/span>(\"Anzahl der Seiten: \" & intSeitenzahl.ToString)\r\n     objDocument.Close()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: &Ouml;ffnen eines PDF-Dokuments und Auslesen der Seitenzahl<\/span><\/b><\/p>\n<ul>\n<li><b>strPfad<\/b>: Nimmt dem Pfad aus dem Textfeld entgegen.<\/li>\n<li><b>objDocument<\/b>: Speichert einen Verweis auf das PDF-Dokument und hat den Typ <b>PdfDocument<\/b>.<\/li>\n<li><b>intSeitenzahl<\/b>: Nimmt die Anzahl der Seiten des PDF-Dokuments auf.<\/li>\n<\/ul>\n<p>Das &Ouml;ffnen des Dokuments erfolgt zu diesem Zweck mit der Methode <b>Open <\/b>und dem Parameter <b>ReadOnly <\/b>&#8211; wir wollen schlie&szlig;lich erst einmal nur lesend auf die Datei zugreifen. Danach fragen wir mit der <b>PageCount<\/b>-Methode die Seitenzahl des Dokuments ab und geben diese in einer Meldung aus.<\/p>\n<h2>Alle Seiten in eine eigene Datei speichern<\/h2>\n<p>Bevor wir die PDF-Datei nach bestimmten Inhalten durchsuchen und damit bestimmen, an welchen Stellen jeweils ein neues Dokument beginnt, wollen wir erst einmal die Technik zum Speichern einzelner Seiten dokumentieren. Dazu durchlaufen wir einfach alle Seiten und speichern diese jeweils in einer eigenen Datei.<\/p>\n<p>Die Prozedur hinterlegen wir f&uuml;r eine weitere neue Schaltfl&auml;che namens <b>btnSeitenExtrahieren<\/b> (siehe Listing 3). Die Prozedur deklariert neben den bereits aus dem vorherigen Beispiel bekannten Variablen noch zwei neue Variablen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnSeitenExtrahieren_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     <span style=\"color:blue;\">Dim <\/span>strPfad<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objDocument<span style=\"color:blue;\"> As <\/span>PdfDocument\r\n     <span style=\"color:blue;\">Dim <\/span>intSeitenzahl<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objDocumentSeite<span style=\"color:blue;\"> As <\/span>PdfDocument\r\n     <span style=\"color:blue;\">Dim <\/span>intSeite<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVerzeichnis<span style=\"color:blue;\"> As String<\/span>\r\n     strPfad = txtPDFDokument.Text\r\n     strVerzeichnis = strPfad.Substring(0, <span style=\"color:blue;\">InStrRev<\/span>(strPfad, \"\\\"))\r\n     objDocument = PdfReader.Open(strPfad, PdfDocumentOpenMode.Import)\r\n     intSeitenzahl = objDocument.PageCount\r\n     For intSeite = 0 To intSeitenzahl - 1\r\n         objDocumentSeite = <span style=\"color:blue;\">New<\/span> PdfDocument()\r\n         objDocumentSeite.AddPage(objDocument.Pages(intSeite))\r\n         objDocumentSeite.Save(strVerzeichnis & \"Seite_\" & (intSeite + 1).ToString() & \".pdf\")\r\n         objDocumentSeite.Close()\r\n     <span style=\"color:blue;\">Next<\/span>\r\n     objDocument.Close()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Extrahieren jeder einzelnen Seite eines Dokuments in ein neues Dokument<\/span><\/b><\/p>\n<ul>\n<li><b>objDocumentSeite<\/b>: Speichert die Referenz auf die jeweils neu zu erstellenden Dokumente.<\/li>\n<li><b>intSeite<\/b>: Laufvariable zum Durchlaufen der Seiten.<\/li>\n<li><b>strVerzeichnis<\/b>: Speichert das Basisverzeichnis, in dem die neuen Seiten angelegt werden sollen.<\/li>\n<\/ul>\n<p>Die Prozedur ermittelt zuerst das Verzeichnis aus <b>strPfad<\/b>, also ohne den Dateinamen des PDF-Dokuments, welches wir in seine einzelnen Seiten zerlegen wollen. Dazu nutzen wir die <b>Substring<\/b>-Methode der Variablen <b>strPfad <\/b>und holen uns damit den Teil bis zum ersten Backslash (<b>\\<\/b>) von hinten aus gesehen.<\/p>\n<p>Dann &ouml;ffnen wir das Quelldokument, was wir diesmal mit dem zweiten Parameter <b>PdfDocumentOpenMode.Import <\/b>erledigen. Wieder lesen wir die Seitenzahl in die Variable <b>intSeitenzahl <\/b>ein. Diese nutzen wir, um in einer <b>For Next<\/b>-Schleife alle Seiten zu durchlaufen. Der Index der <b>Pages<\/b>-Auflistung, &uuml;ber die wir auf die Seiten zugreifen wollen, ist 0-basiert, daher verwenden wir <b>0 <\/b>als Startwert und <b>intSeitenzahl &#8211; 1 <\/b>als Endwert der Schleife.<\/p>\n<p>Innerhalb der Schleife legen wir mit der <b>New<\/b>-Anweisung jeweils ein neues Objekt des Typs <b>PdfDocument <\/b>an und referenzieren es mit der Variablen <b>objDocumentSeite<\/b>.<\/p>\n<p>Diesem f&uuml;gen wir mit der <b>AddPage<\/b>-Methode eine neue Seite hinzu. Der Parameter dieser Methode enth&auml;lt den Verweis auf die jeweilige Seite des Quelldokuments. Anschlie&szlig;end speichern wir das Dokument mit der <b>Save<\/b>-Methode. Den Speicherpfad setzen wir aus dem Verzeichnis aus <b>strVerzeichnis <\/b>und einem Namen zusammen, der aus <b>Seite_<\/b>, dem Wert der Variablen <b>intSeite + 1 <\/b>und der Dateiendung <b>.pdf <\/b>besteht, also beispielsweise <b>Seite_1.pdf<\/b>.<\/p>\n<p>Als Beispiel haben wir eine Ausgabe von <b>Visual Basic Entwickler <\/b>verwendet, das Ergebnis sieht ausschnittsweise wie in Bild 3 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_356_003.png\" alt=\"Exportierte Seiten\" width=\"499,6267\" height=\"538,2575\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Exportierte Seiten<\/span><\/b><\/p>\n<h2>Kriterien zum Aufteilen finden<\/h2>\n<p>Nun wollen wir allerdings nicht einfach alle Seiten extrahieren (auch wenn es sein kann, dass es daf&uuml;r Anwendungsf&auml;lle gibt), sondern wir wollen bestimmte Stellen ermitteln. In unserem Beispiel wollen wir die einzelnen Artikel einer Ausgabe in jeweils einer eigenen PDF-Datei speichern.<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000356\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000356?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000356\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"1b1e1c5bfe\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gelegentlich m&ouml;chte man PDF-Dateien bearbeiten &#8211; und das am besten ohne eigenes Zutun, sondern komplett programmgesteuert. Ein Kunde ist beispielsweise an mich herangetreten und wollte ein riesiges PDF-Dokument, das eine Menge Rechnungen in einer einzigen Datei enthielt, aufteilen. Als Ergebnis w&uuml;nscht er sich einzelne Dateien, die jeweils eine Rechnung enthielten. Grund genug, einmal zu schauen, wie man mit .NET an dieses Problem herangehen kann. Gen&uuml;gend NuGet-Pakete mit Funktionen zum Bearbeiten von PDF-Dokumenten sind verf&uuml;gbar, sodass wir die Qual der Wahl haben. F&uuml;r diese Aufgabe haben wir das NuGet-Paket PDFsharp herangezogen, das verspricht, mit PDF-Seiten umgehen zu k&ouml;nnen &#8211; egal, ob es um das Entfernen, Hinzuf&uuml;gen, Extrahieren oder Zusammenstellen neuer Dokumente geht.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022023,662023,44000032],"tags":[],"yst_prominent_words":[],"class_list":["post-55000356","post","type-post","status-publish","format-standard","hentry","category-66022023","category-662023","category-VBNETProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000356","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000356"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000356\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000356"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000356"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000356"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000356"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}