Da ich oft einige E-Books im PDF-Format herunterlade, haben einige gute Bücher beim Herunterladen manchmal keine Lesezeichen, und es fühlt sich nicht wie eine ganze Lektüre an. Deshalb habe ich mich entschlossen, selbst ein Gerät zu schreiben, und analysieren Sie den Text in einem bestimmten Format in ein bestimmtes Format Ein Lesezeichen, und speichern Sie es dann im PDF -Format.
Die Gesamtidee besteht darin, die Verzeichnisinformationen aus den Einführungen unter DouBan, JD.com, Dangdang und Amazon zu kopieren.
Die Struktur des Verzeichnisses lautet wie folgt:
Die Codekopie lautet wie folgt:
Kapitel 1 HTTP -Übersicht 3
1.1 HTTP-Internet Multimedia Messenger 4
1.2 Web -Client und Server 4
1.3 Ressource 5
1.3.1 Medientyp 6
1.3.2 URI 7
1.3.3 URL 7
1.3.4 Urne 8
1.4 Transaktion 9
1.4.1 Methode 9
1.4.2 Statuscode 10
1.4.3 Webseiten können mehrere Objekte 10 enthalten 10
1.5 Nachricht 11
1.6 Verbindung 13
Jede Zeile hat Seitenzahlen und wird durch Leerzeichen getrennt.
Nach der Verarbeitung ist das Ergebnis:
Die Hauptlogik ist:
Die Codekopie lautet wie folgt:
Paket org.fra.pdf.zuginess;
Import Java.io.BufferedReader;
importieren java.io.fileoutputStream;
importieren java.io.ioException;
Import Java.util.ArrayList;
import Java.util.hashMap;
importieren java.util.list;
import Java.util.stack;
com.itextpdf.text.documentException importieren;
com.itextpdf.text.pdf.inthashtable importieren;
com.itextpdf.text.pdf.pdfarray importieren;
com.itextpdf.text.pdf.pdfDictionary importieren;
com.itextpdf.text.pdf.pdfindirectReference importieren;
com.itextpdf.text.pdf.pdfname importieren;
com.itextpdf.text.pdf.pdfnumber importieren;
com.itextpdf.text.pdf.pdfObject;
com.itextpdf.text.pdf.pdfreader importieren;
com.itextpdf.text.pdf.pdfstamper;
com.itextpdf.text.pdf.pdfstring importieren;
com.itextpdf.text.pdf.SimpleBookmark;
public class addpdfoutlinefromtxt {
private stack <ScrineInfo> parentoutLinestack = new stack <ScLineInfo> ();
public void createpdf (String destpdf, String scellpdf,
BufferedReader Bufread, int Muster) löst IoException aus,
DocumentException {
if (muster! = addbookmarkConstants.reserved_old_outline
&& muster! = addbookmarkconstants.reserved_none
&& muster! = addbookmarkConstants.reserved_first_outline)
zurückkehren;
// In PDF -Datei lesen
PDFREADER reader = new pdffreader (suckpdf);
Liste <HashMap <String, Objekt >> surts = new ArrayList <HashMap <String, Object >> ();
if (muster == addbookmarkConstants.reserved_old_outline) {
surts.addall (SimpleBookmark.Getbookmark (Leser));
} else if (muster ==
AddfirStoutLinereServeDPDF (Surlines, Reader);
}
addbookmarks (bufread, umrissen, null, 0);
// Erstellen Sie einen neuen Stamper
PdfStamper Stamper = new pdfStamper (Leser, neuer FileOutputStream (
destpdf));
Stamper.Setoutlines (Umrisse);
Stamper.close ();
}
Private Leere Addbookmarks (BufferedReader Bufread,
LISTE <HashMap <String, Objekt >> Umrisse,
Hashmap <String, Objekt> Preoutline, int Prelevel)
löst ioException {aus
String contentFormatline = null;
bufread.mark (1);
if ((contentFormatline = bufread.readline ())! = null) {
Formattedbookmark bookmark = parseformattedText (contentFormatline);
HashMap <String, Object> map = ParsebookmarktohashMap (Lesezeichen);
int Level = bookmark.getLevel ();
// Wenn n == m, dann ist es die gleiche Ebene.
if (Level == Prelevel) {
surts.add (map);
addbookmarks (bufread, umrissen, map, Ebene);
}
// Wenn n> m, ist es sicher, dass die Zeile das Kind der vorherigen Zeile ist, neu eine Kinderarraylist, und dieser Arraylist hinzugefügt wird
sonst if (Level> prelevel) {
Liste <HashMap <String, Objekt >> kids = new ArrayList <HashMap <String, Object >> ();
kids.add (Karte);
Preoutline.put ("Kinder", Kinder);
// Umrisse Informationen über Kinder aufzeichnen
ParentoutLinStack.push (neuer Umrinne (Preoutline, umrissen, umsetzt,
Prelevel));
Fügen Sie Buchmarks (Bufread, Kinder, Karte, Level);
}
// Wenn n <m, dann bedeutet dies, dass das Kind hinzugefügt und in die obere Ebene zurückgekehrt wurde, und Bufread kehrt zur Linie zurück
else wenn (Ebene <prelevel) {
bufread.reset ();
ScrineInfo obj = parentoutLinStack.pop ();
addbookmarks (bufread, obj.getoutlines (), obj.getPreoutline (),
obj.getPrelevel ());
}
}
}
Private Hashmap <String, Object> ParsebookmarktohashMap (
Formatiertes Buchmarke -Lesezeichen) {
HashMap <String, Object> map = new HashMap <String, Object> ();
map.put ("title", bookmark.gettitle ());
map.put ("action", "goto");
map.put ("Seite", bookmark.getPage () + "fit");
Rückgabekarte;
}
private formattedbookmark parseformattedText (String contentFormatline) {
Formattedbookmark bookmark = new formattedbookmark ();
String title = "";
String destpage = "";
// Wenn es am Ende der Zeichenfolge keine Seitenzahl gibt, ist es normalerweise der Name des Buches, wenn das Format korrekt ist.
int lastspaceIndex = contentFormatline.lastIndexof ("");
if (lastspaceIndex == -1) {
title = contentFormatline;
destpage = "1";
} anders {
title = contentFormatline.substring (0, lastspaceIndex);
destpage = contentFormatline.substring (lastspaceIndex + 1);
}
String [] titleSplit = title.split ("");
int dotCount = titleSPlit [0] .Split ("//."). Länge - 1;
bookmark.setLevel (dotcount);
bookmark.setPage (trennzeichen);
Lesezeichen.Settitle (Titel);
Rückgabe -Lesezeichen;
}
private void addfirstoutLinereServeDPDF (
Liste <HashMap <String, Objekt >> Umrisse, PDFFREADER -Reader) {
PDFDictionary Catalog = reader.getCatalog ();
PdfObject obj = pdffreader.getPdfObjectrElase (Katalog
.get (pdfname.outlines));
// Kein Lesezeichen
if (obj == null ||! obj.isdiktionary ())
zurückkehren;
PDFDictionary -Umrundung = (PDFDictionary) obj;
// Holen Sie sich das erste Lesezeichen
PdfDictionary firstoutline = (pdfDictionary) pdfreader
.GetPDFOBJectrElease (umrissDictionary.get (pdfname.first));
Pdfstring titleObj = firstoutline.getassstring ((pdfname.title));
String title = titleObj.tounicodestring ();
Pdfarray dest = firstoutline.getasArray (pdfname.dest);
if (dest == null) {
PdfDictionary action = (pdfDictionary) pdfreader
.GetPDFOBJectrElease (firstoutline.get (pdfname.a));
if (action! = null) {
if (pdfname.goto.equals (pdfreader.getPdfObjectrElease (Aktion
.get (pdfname.s)))) {
dest = (pdfarray) pdffreader.getPdfoBJectrelease (Aktion
.get (pdfname.d));
}
}
}
String deststr = ParseDestString (Dest, Reader);
String [] decodestr = deststr.split ("");
int num = Integer.Valueof (decodestry [0]);
HashMap <String, Object> map = new HashMap <String, Object> ();
map.put ("title", title);
map.put ("action", "goto");
map.put ("Seite", num + "fit");
surts.add (map);
}
private String -ParseDestString (PDFARRAY Dest, Pdffreader Reader) {
String deststr = "";
if (dest.isstring ()) {
deststr = dest.toString ();
} else if (dest.isname ()) {
deststr = pdfname.decodename (dest.toString ());
} else if (dest.isarray ()) {
Inthashtable pages = new inthashtable ();
int numpages = reader.getNumberofpages ();
für (int k = 1; k <= numpages; ++ k) {
Pages.put (reader.getPageorigref (k) .getNumber (), k);
Reader.Releaspage (k);
}
deststr = makeBookmarkparam ((pdfarray) dest, Seiten);
}
Rückkehr Deststr;
}
private String makeBookmarkparam (pdfarray dest, inthashtable pages) {
StringBuffer s = new StringBuffer ();
PdfObject obj = dest.getPdfObject (0);
if (obj.isNumber ()) {
S.Append (((pdfnumber) obj) .IntValue () + 1);
} anders {
S.Append (Seiten.get (GetNumber ((pdfindirectReference) obj)));
}
S.Append ('') .Append (dest.getPdfObject (1) .ToString (). Substring (1));
für (int k = 2; k <dest.size (); ++ k) {
S.Append ('') .Append (dest.getPdfObject (k) .ToString ());
}
return s.tostring ();
}
private int getNumber (pdfindirectreeference Indirect) {
PdfDictionary pdfoBj = (pdfDictionary) pdfreader
.GetPDFOBJectrElease (indirekt);
if (pdfobj.contains (pdfname.type)
&& pdfobj.get (pdfname.type) .equals (pdfname.pages)
&& pdfobj.contains (pdfname.kids)) {
Pdfarray kids = (pdfarray) pdfobj.get (pdfname.kids);
indirect = (pdfindirectReference) kids.getPdfObject (0);
}
return indirect.getNumber ();
}
}