Karena saya sering mengunduh beberapa e-book dalam format pdf, kadang-kadang beberapa buku bagus tidak memiliki bookmark saat mengunduh, dan rasanya tidak seperti membaca secara keseluruhan, jadi saya memutuskan untuk menulis gadget sendiri, menguraikan teks dalam format tertentu ke Bookmark, dan kemudian simpan dalam format PDF.
Gagasan keseluruhannya adalah menyalin informasi direktori dari perkenalan di bawah Douban, JD.com, Dangdang, dan Amazon.
Struktur direktori adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
Bab 1 Tinjauan HTTP 3
1.1 HTTP-Internet Multimedia Messenger 4
1.2 Klien Web dan Server 4
1.3 Sumber Daya 5
1.3.1 Tipe Media 6
1.3.2 URI 7
1.3.3 URL 7
1.3.4 guci 8
1.4 Transaksi 9
1.4.1 Metode 9
1.4.2 Kode Status 10
1.4.3 Halaman Web dapat berisi banyak objek 10
1.5 Pesan 11
1.6 Koneksi 13
Setiap baris memiliki nomor halaman dan dipisahkan oleh spasi.
Setelah diproses, hasilnya adalah:
Logika utamanya adalah:
Salinan kode adalah sebagai berikut:
paket org.fra.pdf.business;
impor java.io.bufferedReader;
impor java.io.fileoutputStream;
impor java.io.ioException;
impor java.util.arraylist;
impor java.util.hashmap;
impor java.util.list;
impor java.util.stack;
impor com.itextpdf.text.documentException;
impor com.itextpdf.text.pdf.inthashtable;
impor com.itextpdf.text.pdf.pdfarray;
impor com.itextpdf.text.pdf.pdfdictionary;
impor com.itextpdf.text.pdf.pdfindirectreference;
import com.itextpdf.text.pdf.pdfname;
impor com.itextpdf.text.pdf.pdfnumber;
impor com.itextpdf.text.pdf.pdfObject;
impor com.itextpdf.text.pdf.pdfreader;
impor com.itextpdf.text.pdf.pdfstamper;
impor com.itextpdf.text.pdf.pdfString;
impor com.itextpdf.text.pdf.simpleBookmark;
kelas publik addpdfoutlinefromtxt {
private stack <outlineInfo> parentOutlinestack = new stack <outlineinfo> ();
public void createPdf (String destpdf, string sourcePdf,
BufferedReader Bufread, Int Pattern) melempar ioException,
DocumentException {
if (Pattern! = AddBookMarkConstants.reserved_old_outline
&& pola! = addBookMarkConstants.reserved_none
&& pola! = AddBookMarkConstants.reserved_first_outline)
kembali;
// Baca dalam file PDF
PDFREADER Reader = PDFREADER BARU (SOURCEPDF);
Daftar <hashMap <String, Object >> Outlines = New ArrayList <HashMap <String, Object >> ();
if (pola == addbookmarkconstants.reserved_old_outline) {
outlineS.addall (SimpleBookMark.getBookmark (pembaca));
} lain jika (pola == addBookMarkConsants.reserved_first_outline) {
addFirstoutlinereservedpdf (garis besar, pembaca);
}
AddBookMarks (Bufread, Outline, Null, 0);
// Buat stamper baru
PDFStamper stamper = PDFStamper baru (pembaca, FileOutputStream baru (
destpdf));
stamper.setoutlines (garis besar);
stamper.close ();
}
Private Void AddBookMarks (bufferedReader Bufread,
Daftar <hashmap <string, objek >> garis besar,
HashMap <String, Object> Preoutline, Int Prelevel)
melempar ioException {
String ContentFormatLine = null;
bufread.mark (1);
if ((contentFormatLine = bufread.readline ())! = null) {
FormattedBookmark bookmark = parseformattedText (ContentFormatLine);
HashMap <String, Object> Map = ParsebookmarkToHashMap (Bookmark);
int level = bookmark.getlevel ();
// Jika n == m, maka itu adalah lapisan yang sama.
if (level == prelevel) {
outlines.add (peta);
AddBookMarks (bufread, garis besar, peta, level);
}
// Jika n> m, maka dapat dipastikan bahwa garis adalah anak dari baris sebelumnya, baru A Arraylist Kids, dan ditambahkan ke daftar array ini
lain jika (level> prelevel) {
Daftar <hashmap <string, objek >> kids = new arraylist <hashmap <string, objek >> ();
anak -anak.add (peta);
preoutline.put ("anak -anak", anak -anak);
// Catat informasi garis besar tentang anak -anak
ParentoutLinestack.push (OutlineInfo baru (preoutline, garis besar,
prelevel));
AddBookMarks (Bufread, Kids, Map, Level);
}
// Jika n <m, maka itu berarti bahwa anak telah ditambahkan dan dikembalikan ke tingkat atas, dan bufread akan kembali ke garis
lain jika (level <prelevel) {
bufread.reset ();
Outlineinfo obj = parentoutlinestack.pop ();
AddBookMarks (bufread, obj.getoutlines (), obj.getpreoutline (),
obj.getPrelevel ());
}
}
}
hashmap pribadi <string, objek> parsebookmarktohashmap (
Formattedbookmark bookmark) {
HashMap <String, Object> Map = HashMap baru <String, Object> ();
peta.put ("judul", bookmark.gettitle ());
Map.put ("Action", "Goto");
peta.put ("halaman", bookmark.getPage () + "fit");
peta mengembalikan;
}
Private FormattedBookMark ParSeFORMATTEDTEXT (String ContentFormatLine) {
Formattedbookmark bookmark = formattedbookmark baru ();
String title = "";
String destPage = "";
// Ketika tidak ada nomor halaman di akhir string, biasanya nama buku, jika formatnya benar.
int lastspaceIndex = contentFormatLine.LastIndexOf ("");
if (lastspaceIndex == -1) {
title = ContentFormatLine;
destPage = "1";
} kalau tidak {
title = ContentFormatLine.SubString (0, LastSpaceIndex);
destPage = ContentFormatLine.SubString (LastSpaceIndex + 1);
}
String [] titleSplit = title.split ("");
int dotcount = titleSplit [0] .split ("//."). Panjang - 1;
bookmark.setlevel (dotcount);
bookmark.setpage (destPage);
bookmark.settitle (judul);
Bookmark kembali;
}
Private Void AddFirstoutlinereservedPDF (
Daftar <HashMap <String, Object >> Garis Besar, PDFreader Reader) {
Katalog pdfDictionary = reader.getCatalog ();
PDFObject Obj = PdFreader.getpdfobjectrelease (Katalog
.get (pdfname.outlines));
// tidak ada bookmark
if (obj == null ||! obj.isdictionary ())
kembali;
PDFDictionary outlinesDictionary = (pdfDictionary) obj;
// Dapatkan bookmark pertama
PDFDictionary FirstOutline = (PDFDictionary) PDFREADER
.getpdfoBJectrelease (outlineSdictionary.get (pdfname.first));
PDFString titleobj = firstOutline.getAsstring ((PDFName.Title));
String title = titleobj.tounicodestring ();
Pdfarray dest = firstoutline.getArArray (pdfname.dest);
if (dest == null) {
PDFDictionary Action = (PDFDictionary) PDFREADER
.getpdfoBJectrelease (firstoutline.get (pdfname.a));
if (action! = null) {
if (pdfname.goto.equals (pdfreader.getpdfobjectrelease (Action
.get (pdfname.s)))) {
dest = (pdfarray) pdfreader.getpdfobjectrelease (tindakan
.get (pdfname.d));
}
}
}
String deststr = parsedestString (dest, pembaca);
String [] decodestr = deststr.split ("");
int num = integer.valueof (decodestr [0]);
HashMap <String, Object> Map = HashMap baru <String, Object> ();
Map.put ("Judul", Judul);
Map.put ("Action", "Goto");
peta.put ("halaman", num + "fit");
outlines.add (peta);
}
Private String ParsedestString (PDFArray Dest, PDFreader Reader) {
String deststr = "";
if (dest.isstring ()) {
deststr = dest.tostring ();
} lain if (dest.isname ()) {
deststr = pdfname.decodename (dest.toString ());
} lain if (dest.isArray ()) {
Halaman inThashtable = new Inthashtable ();
int numpages = reader.getNumberofpages ();
untuk (int k = 1; k <= numpages; ++ k) {
halaman.put (reader.getPageorigref (k) .getNumber (), k);
reader.releasepage (k);
}
Deststr = MakebookMarkParam ((PDFArray) Dest, halaman);
}
Kembalikan Deststr;
}
Private String MakebookMarkParam (PDFArray Dest, halaman InTheShtable) {
StringBuffer S = StringBuffer baru ();
PDFObject obj = dest.getpdfObject (0);
if (obj.isnumber ()) {
s. lampai (((PDFNumber) OBJ) .IntValue () + 1);
} kalau tidak {
s. lampai (halaman.get (getNumber ((pdfindirectreference) obj)));
}
s. lampai (''). lappend (dest.getpdfobject (1) .toString (). Substring (1));
untuk (int k = 2; k <dest.size (); ++ k) {
s. lampai (''). lappend (dest.getpdfobject (k) .toString ());
}
return s.tostring ();
}
private int getNumber (pdfindirectreference tidak langsung) {
Pdfdictionary pdfobj = (pdfdictionary) pdfreader
.getpdfobjectrelease (tidak langsung);
if (pdfobj.contains (pdfname.type)
&& pdfobj.get (pdfname.type) .equals (pdfname.pages)
&& pdfobj.contains (pdfname.kids)) {
Pdfarray anak -anak = (pdfarray) pdfobj.get (pdfname.kids);
tidak langsung = (pdfindirectreference) anak -anak.getpdfObject (0);
}
return iNdirect.getNumber ();
}
}