Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Computer Skills
  2. App Training

Wie kann man Daten aus Tabellen in PDFs mit Tabula und OpenRefine extrahieren?

by
Read Time:14 minsLanguages:
This post is part of a series called Going Paperless.
How To Perfect A PDF with PDFpen

German (Deutsch) translation by Katharina Grigorovich-Nevolina (you can also view the original English article)

Es gibt Unmengen von Daten, die in Tabellen eingeschlossen sind, die in PDF-Aufsätze und Berichte eingebettet sind. PDFs sind allgegenwärtig, aber es ist schwieriger, die darin enthaltenen Daten zu verwenden, als dies in einer Tabelle der Fall wäre. Selbst wenn Sie die Daten extrahieren können, kann es schwierig sein, konsistente Ergebnisse zu erzielen. Eine Tabelle könnte Linien haben, um die Zellgrenzen hervorzuheben, während andere nur Leerzeichen haben könnten, um eine Tabellenansicht zu erzielen. Sie können sich auch hinsichtlich des Inhalts von übergreifenden Zeilen und / oder Spalten unterscheiden. Oft besteht die einzige Konstante darin, dass sie alle Daten enthalten, die Sie extrahieren möchten.

Sie können zwar manuell Daten aus einer Tabelle in einer PDF-Datei extrahieren, dies ist jedoch alles andere als einfach. Es gibt keinen Grund, sich so viel Zeit zu nehmen, wenn es Tools gibt, die unsere Arbeit vereinfachen. In diesem Tutorial zeige ich Ihnen, wie Sie mit Tabula einfach Tabellen aus dem PDF extrahieren und dann die unordentlichen Daten mit OpenRefine in ein benutzerfreundlicheres Formular bereinigen können.

Warum Tabula?

Jeder, der mit Daten arbeitet, kennt ein häufiges Problem: Sie haben einige interessante Daten für Ihr journalistisches Projekt oder Statistiken für die Erstellung einer schönen Karte gefunden, aber die Daten sind unordentlich und in einer PDF-Datei eingeschlossen, die von Ihrem Programm nicht automatisch gelesen werden kann. Sie müssen also entweder Datenzeilen aus einer PDF-Datei in Excel ausschreiben oder langwierig kopieren und einfügen. Diese Art der manuellen Arbeit erzeugt Reibung und anschließend verlieren Sie viel Zeit.

Als Forschungsabsolvent habe ich diesen Schmerz des manuellen Kopierens und Einfügens von Tabellen für meine Diplomarbeit durchgemacht. Ich habe immer von einer Anwendung geträumt, die die Tabelle mit einem Klick aus PDF extrahieren kann - und genau das ist Tabula. Es ist eine kostenlose, Java-basierte App, die in einer Weboberfläche auf Ihrem Computer ausgeführt wird und Daten aus fast jeder Tabelle in einer PDF-Datei extrahieren kann. In Sekundenschnelle können die Daten extrahiert werden, für deren erneutes Eingeben Sie Stunden benötigen würden.

Wie benutzt man Tabula?

Laden Sie zunächst die entsprechende Zip-Datei für Ihren Computer von der Tabula-Website herunter und entpacken Sie sie in einen Ordner Ihrer Wahl. Stellen Sie sicher, dass auch Java v6 oder 7 installiert ist. Wenn nicht, können Sie es kostenlos von der Oracle-Website herunterladen. Dieser Link verweist auf die werbefreie / Symbolleisten-freie Version, sodass Sie sich keine Sorgen mehr machen müssen, dass etwas anderes installiert wird.

Wenn Sie Tabula starten, wird zunächst ein Befehlsfenster angezeigt, und innerhalb weniger Sekunden sollte Ihr Browser automatisch auf http://127.0.0.1:8080 geöffnet werden. Wenn nicht, öffnen Sie Ihren Webbrowser und geben Sie diese URL in das Adressfeld ein. Senden Sie Ihre PDF-Datei, und Tabula verarbeitet Ihre Datei und zeigt Ihnen eine schöne Liste mit Seitenminiaturen an. Suchen Sie nach der Tabelle, die Sie extrahieren möchten, oder aktivieren Sie die Option "Tabellen automatisch erkennen", wenn Sie eine kleine PDF-Datei haben.

tabula-screen-pdf-thumbnailtabula-screen-pdf-thumbnailtabula-screen-pdf-thumbnail
Startbildschirm von Tabula mit Seitenminiaturen und Tabellen, die Sie extrahieren möchten

Klicken und ziehen Sie, um den Bereich der Tabelle auszuwählen. Sobald Sie die Maus loslassen, zeigt Tabula Ihnen die extrahierte Tabelle in einem benutzerfreundlichen Format an. Wenn die Daten unscharf sind, entfernen Sie die Überschriften oder Fußnoten und mehr. Schließlich können Sie die extrahierte Tabelle entweder als durch Kommas getrennte Werte(CSV) oder als durch Tabulatoren getrennte Werte(TSV) herunterladen oder die Daten in die Zwischenablage kopieren. Sobald sich die Daten in einer Tabelle befinden, müssen Sie möglicherweise einige Änderungen vornehmen, z. B. die Überschriften oder Fußnoten korrigieren.

extracted-table-pdf-tabulaextracted-table-pdf-tabulaextracted-table-pdf-tabula
Extrahierte Tabelle aus PDF mit Tabula

Wenn Sie Tabula in Windows herunterfahren müssen, wechseln Sie zu diesem Befehlsfenster und drücken Sie Strg-C. Warten Sie, bis eine Meldung angezeigt wird, dass das Herunterfahren abgeschlossen ist. Dieses Fenster wird möglicherweise automatisch oder selbst geschlossen. Wechseln Sie auf dem Mac zur App (klicken Sie mit der rechten Maustaste auf das Symbol im Dock) und drücken Sie CMD-Q. Wenn Sie Mac OS X 10.8 oder höher ausführen, müssen Sie die Gatekeeper-Einstellungen anpassen, um Fehlermeldungen während der Installation zu vermeiden.

Tabula wird nicht immer perfekt sein, und es gibt noch einige Probleme zu lösen. Ab sofort funktioniert es nur mit textbasierten PDF-Dateien. Wenn Sie also PDFs gescannt haben, müssen Sie nur noch Handarbeit leisten. Wenn Sie jedoch über eine Kopie von Acrobat verfügen, können Sie möglicherweise Bild-PDFs in eine bearbeitbare PDF-Datei konvertieren, die dies ermöglicht arbeite mit Tabula. Wenn Sie PDFs mit mehrzeiligen Zeilen haben, meldet Tabula häufige Fehler in Tabellen ohne grafische Zeilentrennzeichen. Achten Sie daher darauf.

Warum OpenRefine?

Gelegentliche Rechtschreibfehler, zusätzlicher Speicherplatz, zufällige Interpunktion, seltsame Groß- und Kleinschreibung, doppelte Aufzeichnungen und mehr sind selbstverständlich, wenn Sie Daten aus PDFs extrahieren. Unabhängig davon, wie gut der Auszug auf den ersten Blick aussieht, werden Ihre Daten bei Fehlern durcheinander sein und Probleme beim Abrufen von Daten, bei der Interoperabilität und bei der Indizierung verursachen.

Hier kommt OpenRefine (ehemals Google Refine) ins Spiel. Es ist ein weiteres kostenloses Tool, mit dem Sie diese Fehler und Datenungenauigkeiten leicht identifizieren können. Mit OpenRefine können Sie nicht nur die Genauigkeit Ihrer Daten schnell diagnostizieren, sondern auch automatisiert auf bestimmte Fehler reagieren. Es kann Daten in vielen vorhandenen Zellen in großen Mengen transformieren, um die Daten zu bereinigen, sie mit mehr Daten aus anderen Quellen erweitern und in andere Formate konvertieren, sodass Sie sie in den gewünschten Apps verwenden können.

Wie benutzt man OpenRefine?

OpenRefine hat wieder eine Weboberfläche, läuft auf Ihrem Computer und benötigt Java. Der einzige Unterschied besteht darin, dass es diesmal in Ihrem Browser unter http://127.0.0.1:3333 geöffnet wird.

Wenn Sie OpenRefine öffnen, sehen Sie auf der linken Seite drei Optionen: Projekt erstellen, in das Sie Daten entweder vom Computer, einer Webadresse, einer Zwischenablage oder einer Google-Tabelle importieren können; Projekt öffnen, mit dem Sie zu einem vorhandenen Projekt zurückkehren können, das während einer früheren Sitzung erstellt wurde; und Projekt importieren, mit dem wir ein vorhandenes OpenRefine-Projektarchiv direkt importieren können. OpenRefine versteht eine Vielzahl von Datendateiformaten, darunter TSV, CSV, Excel-Dokumente und sogar XML und JSON - ein Favorit für Web- und Anwendungsentwickler.

home-screen-openrefinehome-screen-openrefinehome-screen-openrefine
Startbildschirm von OpenRefine

Navigieren Sie zu Ihrer exportierten CSV-Datei und klicken Sie auf Weiter. Auf dem nächsten Bildschirm erhalten Sie einen Überblick über Ihr Dataset, wie es in OpenRefine angezeigt wird. Standardmäßig wird die erste Zeile korrekt als Name einer Spalte analysiert. Eine weitere Option ist das Kontrollkästchen "Anführungszeichen werden verwendet, um Zellen einzuschließen, die Spaltentrennzeichen enthalten". Wenn Sie es ausgewählt lassen, stellen Sie sicher, dass alle Zellenwerte in Anführungszeichen in der Originaldatei eingeschlossen sind. Deaktivieren Sie andernfalls dieses Kontrollkästchen, um sicherzustellen, dass die Anführungszeichen von OpenRefine nicht falsch interpretiert werden.

Die anderen Optionen können in einigen Fällen nützlich sein. Versuchen Sie, sie auszuwählen und abzuwählen, um zu sehen, wie sie sich auf Ihre Daten auswirken. Beachten Sie, wie die Vorschau aktualisiert wird, um diese Änderungen widerzuspiegeln. Stellen Sie außerdem sicher, dass Sie die richtige Codierung auswählen, um zu vermeiden, dass Sonderzeichen verwechselt werden. Wenn alles richtig erscheint, geben Sie Ihrem Projekt einen Namen und klicken Sie auf Projekt erstellen.

dataset-loaded-openrefinedataset-loaded-openrefinedataset-loaded-openrefine
Datensatz in OpenRefine geladen

Um die verschiedenen Datenmanipulationstechniken zu demonstrieren, können Sie entweder Ihr eigenes Dataset verwenden oder ein Demo-Dataset aus dem Github-Repository herunterladen, um es selbst zu versuchen. Sobald Ihr Datensatz in OpenRefine geladen wurde, sollten Sie lernen, Daten durch Scannen der verschiedenen Zonen zu untersuchen. Von oben nach unten können Sie vier Zonen beobachten.

In der ersten Zone können Sie die Gesamtzahl der Zeilen für eine bestimmte Datei anzeigen. In der zweiten Zone können Sie versuchen, zwischen Zeilen und Datensätzen zu wechseln, indem Sie auf eines der Wörter klicken. In dieser Zone können Sie auch auswählen, ob 5, 10 oder 50 Zeilen / Datensätze auf einer Seite angezeigt werden sollen, und Sie können auch von Seite zu Seite navigieren. In der dritten Zone finden Sie hier die erste Zeile, die beim Erstellen des Projekts als Spaltenüberschrift analysiert wurde. In meinem Datensatz lesen die Spalten Universität, Stiftung, Anzahl Fakultät und so weiter. Die Spalte ganz links heißt immer Alle und ist in drei Unterspalten unterteilt, die Sterne, Flags und IDs enthalten. Jede Spalte verfügt über ein Menü, auf das Sie zugreifen können, indem Sie auf das kleine Dropdown-Dreieck klicken. Schließlich zeigt die vierte Zone den tatsächlichen Hauptbereich mit den tatsächlichen Werten der Zellen. Wenn Sie mit der Maus über eine Zelle fahren, können Sie diesen bestimmten Datentyp bearbeiten.

explore-zone-openrefineexplore-zone-openrefineexplore-zone-openrefine
Verschiedene Zonen von OpenRefine

Spalten sind ein wesentlicher Bestandteil von OpenRefine. Standardmäßig werden alle Spalten erweitert. Dies kann umständlich sein, wenn das Projekt viele Spalten enthält. Wenn Sie eine weitere Spalte vorübergehend ausblenden möchten, um die Arbeit an den anderen zu erleichtern, klicken Sie auf das kleine Dropdown-Dreieck in einer beliebigen Spalte, um das Menü anzuzeigen, und wählen Sie Ansicht. Hier sehen Sie vier Optionen: Diese Spalte reduzieren, Alle anderen Spalten reduzieren, Spalten nach links reduzieren und Spalten nach rechts reduzieren.

Spielen Sie mit den einzelnen Spaltenoptionen, bis Sie mit dem Ergebnis zufrieden sind. Um eine Spalte erneut zu erweitern, klicken Sie einfach darauf. In einigen Fällen kann es nützlich sein, die Reihenfolge der Spalten zu ändern, um beispielsweise Spalten zusammenzuführen, die verglichen werden müssen. Um dies zu erreichen, rufen Sie das Menü einer beliebigen Spalte auf und klicken Sie auf Spalte bearbeiten. Auch hier stehen vier Optionen zur Verfügung: Spalte an Anfang verschieben, Spalte an Ende verschieben, Spalte nach links verschieben und Spalte nach rechts verschieben. Wenn Sie die Spalten vollständig neu anordnen möchten, verwenden Sie die Spalte Alle.

Die Option Ansicht bietet Ihnen eine schnelle Möglichkeit, alle Spalten zu erweitern oder zu reduzieren, während die Option Spalte bearbeiten eine schnelle Möglichkeit bietet, Spalten neu zu ordnen, indem Sie sie verschieben oder unterdrücken, indem Sie sie rechts ablegen (siehe folgenden Screenshot).

columns-re-arrangement-openrefinecolumns-re-arrangement-openrefinecolumns-re-arrangement-openrefine
Neuanordnung der Spalten in OpenRefine

Wenn Ihr Projekt groß ist, sollten Sie zunächst lernen, wie Sie Daten als visuelle Hilfe sortieren, da durch das Sortieren Ihr Datensatz einfacher zu erkunden und zu bearbeiten ist. Um Ihre Daten nach ihren Universität-Namen zu sortieren, wählen Sie im Spaltenmenü die Option Sortieren, um auf den folgenden Bildschirm zuzugreifen. Wenn Sie sich den Screenshot ansehen, können Sie die Zellenwerte nach ihrem Typ sortieren: Text, Zahlen, Datumsangaben und Boolesche Werte. Für jeden Typ können sie in unterschiedlicher Reihenfolge sortiert werden.

Beispielsweise kann Text entweder alphabetisch (a bis z) oder umgekehrt alphabetisch (z bis a) sortiert werden, Boolesche Werte sind falsch und dann wahr oder umgekehrt und so weiter. Darüber hinaus können wir festlegen, wo Fehler und Leerzeichen in Bezug auf gültige Werte gespeichert werden, indem wir sie in der gewünschten Reihenfolge ziehen. Zum Beispiel könnten Fehler zuerst sortiert werden, um sie leichter zu erkennen, gefolgt von gültigen Werten in mittleren und leeren Werten am Ende.

sorting-data-openrefinesorting-data-openrefinesorting-data-openrefine
Daten in OpenRefine sortieren

Eines der Tools in OpenRefine, die Sie am häufigsten verwenden, ist das Facettieren. In der Regel erstellen Sie eine Facette für eine bestimmte Spalte. In der Facette werden die Zellen in dieser Spalte zusammengefasst, um ein umfassendes Bild Ihrer Daten in der Seitenleiste zu erhalten. Gleichzeitig können Sie Daten nach einer Teilmenge von Zeilen filtern, die Sie in großen Mengen ändern möchten. Es gibt verschiedene Möglichkeiten, Daten zu facettieren. Abhängig von den Datensatzwerten und Ihren Anforderungen sind dies: Textfacetten für Zeichenfolgen, numerische Facetten für Zahlen und Datumsangaben und benutzerdefinierte Facetten zum Definieren Ihres eigenen Textes und numerischer Facetten.

Die Textfacette ist ein sehr nützliches Werkzeug, ähnlich dem Filtern in einer Tabelle. Textfacette gruppiert eindeutige Textwerte in Gruppen. Dies kann uns helfen, Informationen zusammenzuführen, und wir können Werte sehen, die auf viele verschiedene Arten geschrieben werden können. Jetzt erstellen wir eine Textfacette in der Land-Spalte, indem wir auf das Dropdown-Menü dieser Spalte klicken und Facette → Textfacette auswählen.

Das Ergebnis dieser Facette wird auf der Registerkarte Facette / Filter links auf dem Bildschirm angezeigt. Im folgenden Screenshot sehen wir die Spalte Land, das nach den Namen gruppiert ist, aber ich habe einige seltsame Einträge wie "USA", "USA" und "USA" zusammen mit den ungeraden "USA" gefunden. Sind sie nicht alle gleich?

text-facet-openrefine
Textfacette in OpenRefine

Sie können diese Abweichungen manuell bearbeiten, müssen dies jedoch nicht. Die Option Cluster hilft Ihnen dabei, diese Art von schmutzigen Daten leicht zu finden und zu beheben. Klicken Sie auf die Dropdown-Liste Länderspalte und navigieren Sie zu Zellen bearbeiten → Cluster und Bearbeiten. OpenRefine zeigt dann ein Dialogfeld an, in dem Sie verschiedene Clustering-Methoden auswählen können, von denen jede verschiedene Keying-Funktionen verwenden kann.

Unter Werte im Cluster können Sie die verschiedenen Schreibweisen und die Anzahl der Zeilen sehen, die eine bestimmte Schreibweise enthalten. Die Fusion? Die Spalte enthält ein Kontrollkästchen. Wenn Sie dieses Kontrollkästchen aktivieren, werden alle Werte in diesem Cluster in den Wert in der Spalte Neuer Zellenwert geändert. Hier kann ich den neuen Zellenwert manuell als "Vereinigte Staaten von Amerika" eingeben und dann auf die Schaltfläche Ausgewählte zusammenführen und Schließen klicken, um alle ausgewählten Cluster zusammenzuführen.

Möglicherweise finden Sie im Datensatz weitere Unstimmigkeiten. Wenn ja, wählen Sie eine andere Methode aus dem Dropdown-Menü und wählen Sie verschiedene Tastfunktionen. Spielen Sie mit verschiedenen Optionen, bis Sie alle Inkonsistenzen behoben haben. Wenn Sie sich mit der Funktionsweise von OpenRefine-Clustering befassen möchten, lesen Sie diesen Artikel in seinem Github.

clustering-openrefineclustering-openrefineclustering-openrefine
Clustering in OpenRefine

Wenn eine Textfacette eindeutige Textwerte in Gruppen gruppiert, gruppiert eine numerische Facette Zahlen in numerische Bereichsbereiche. Wir müssen die Daten für die Anzahl der Schüler in der Spalte numStudents bereinigen. Nicht alle Werte sind numerisch, und viele von ihnen enthalten möglicherweise zusätzlich zur tatsächlichen Anzahl der Schüler Textbits. Um herauszufinden, welche Einträge repariert werden müssen, werde ich eine numerische Facette verwenden.

Navigieren Sie im Spaltenmenü numStudents zu Facette → Numerische Facette und sehen Sie sich an, was links auf der Registerkarte Facette/Filter angezeigt wird. Dies zeigt uns ein Histogramm der Werte und listet auch die Anzahl der Einträge pro Typ (numerisch, nicht numerisch, leer, Fehler) auf, überwacht die nicht numerischen Zeilen und deaktiviert die anderen Typen. Wir können bereits einige Probleme erkennen, da einige Zellen neben Ziffern auch Text und verschiedene andere Abweichungen aufweisen. Kurz gesagt, die numerische Spalte ist nicht rein numerisch und enthält einige schmutzige Daten.

Wir können hier zwei Dinge tun: Verwenden Sie die Textfacette, um den gesamten „Text außer den Ziffern“ in der linken Seitenleiste aufzulisten. Bewegen Sie dann die Maus über alle unordentlichen Daten, und Sie sehen eine Option namens Bearbeiten. Ein Dialogfeld wird geöffnet Entfernen Sie den Text mit der Rücktaste und klicken Sie auf Übernehmen. In meinem Datensatz habe ich mit einem einzigen Klick den Text „Great Valley“ aus 560 Zeilen entfernt.

numeric-facet-openrefinenumeric-facet-openrefinenumeric-facet-openrefine
Numerische Facette in OpenRefine

Facetten sind definitiv leistungsstarke Werkzeuge, aber manchmal können Inkonsistenzen in der Zellenspalte auftreten. Die einzige Möglichkeit, Zellen in einer Spalte zu bearbeiten, besteht darin, den Befehl Common Transform in dieser Spalte aufzurufen. Wählen Sie im Dropdown-Menü der Spalte die Option Zellen bearbeiten → Allgemeiner Transformation-Befehl. Sie werden sehen, dass es hier eine Reihe nützlicher Funktionen gibt, mit denen Sie Ihre Daten bereinigen und sicherstellen können, dass sie konsistent sind. Hier ist der Grund: Manchmal setzen Personen bei der Dateneingabe ein Leerzeichen vor oder nach einem Namen. Sie können es nicht sehen, aber wenn es darum geht, zwei Datensätze zu kombinieren, interpretiert die Tabellenkalkulationssoftware es als zwei Datensätze. Zum Beispiel unterscheidet sich "Rahul" von "Rahul".

Gehen Sie zu der Spalte, in der Sie Leerzeichen entfernen möchten, und navigieren Sie zu Zellen bearbeiten → Gemeinsame Transformation → Führende und nachfolgende Leerzeichen kürzen. Ein weiteres häufiges Problem mit Daten ist die inkonsistente Formatierung. Gelegentlich lässt jemand die Feststelltaste aktiviert oder vergisst, einen Namen groß zu schreiben. Diese drei Optionen: In Groß- und Kleinschreibung, in Kleinbuchstaben werden alle Zellen in dieser Spalte so konvertiert, dass sie auf die eine oder andere Weise konsistent formatiert werden.

common-transform-openrefinecommon-transform-openrefinecommon-transform-openrefine
Allgemeine Transformation in OpenRefine

Eine sehr nützliche Funktion von OpenRefine ist die Behandlung des Verlaufs aller Änderungen, die sich auf die Daten seit der Erstellung des Projekts ausgewirkt haben. In der Praxis bedeutet dies, dass Sie niemals Angst haben sollten, Dinge mit dem Datensatz auszuprobieren. Sie können jederzeit mit Ihren Daten herumspielen und eine beliebige Anzahl von Facetten oder Transformationen anwenden, da Sie diese jederzeit rückgängig machen können, wenn Sie feststellen, dass es sich um einen Fehler handelt

Um auf den Projektverlauf zuzugreifen, klicken Sie oben links auf dem Bildschirm direkt neben dem Filter/der Facette auf die Registerkarte Rückgängig/Wiederherstellen (sehen Sie Abbildung). Um die Uhr zurückzudrehen, klicken Sie auf den letzten Schritt, den Sie beibehalten möchten, und die Ruhe wird ausgegraut. Klicken Sie auf 0. Projekt erstellen, um alle Änderungen abzubrechen und die Daten so wiederherzustellen, wie sie vor einer Transformation waren. Klicken Sie zum Wiederherstellen auf den Schritt, bis zu dem Sie den Verlauf wiederherstellen möchten.

project-history-openrefine
Projektverlauf in OpenRefine

Sobald Sie Ihr Projekt abgeschlossen haben, können Sie die Daten aus einem vorhandenen OpenRefine-Projekt exportieren. Über das Menü Exportieren oben rechts auf dem Bildschirm können Sie genau das tun. Die unterstützten Formate sind: TSV, CSV, Excel-Format, ODF-Tabelle, JSON- und HTML-Tabelle. Die letzte Option ist praktisch, wenn Sie Ihre bereinigten Daten online veröffentlichen möchten.

Schlussfolgerung

In diesem Tutorial haben Sie die Grundlagen zur Verwendung von Tabula und OpenRefine. Irgendwann werden Sie möglicherweise von der Komplexität hinter OpenRefine überwältigt, aber machen Sie sich keine Sorgen. Nehmen Sie sich Zeit und denken Sie daran, dass das Arbeiten mit Daten nicht nur Code oder Klicks ist. Sie müssen Ihrer Intuition folgen, um Daten in hervorragendem Zustand zu erhalten. Wenn Sie einen Fehler machen, können Sie jederzeit alles rückgängig machen.

Wenn Sie Probleme beim Einstieg in Tabula oder OpenRefine haben oder einzigartige Methoden haben, die Sie teilen möchten, teilen Sie uns dies bitte in den Kommentaren unten mit.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.