เนื่องจากฉันมักจะดาวน์โหลด e-books บางส่วนในรูปแบบ PDF บางครั้งหนังสือบางเล่มที่ดีไม่มีบุ๊กมาร์กเมื่อดาวน์โหลดและมันก็ไม่รู้สึกเหมือนการอ่านทั้งหมดดังนั้นฉันจึงตัดสินใจเขียนอุปกรณ์ด้วยตัวเองแยกวิเคราะห์ข้อความในรูปแบบที่เฉพาะเจาะจง บุ๊คมาร์คแล้วบันทึกลงในรูปแบบ PDF
แนวคิดโดยรวมคือการคัดลอกข้อมูลไดเรกทอรีจากการแนะนำด้านล่าง Douban, JD.com, Dangdang และ Amazon
โครงสร้างของไดเรกทอรีมีดังนี้:
การคัดลอกรหัสมีดังนี้:
บทที่ 1 ภาพรวม HTTP 3
1.1 มัลติมีเดียมัลติมีเดียของ HTTP-Internet 4
1.2 เว็บไคลเอนต์และเซิร์ฟเวอร์ 4
1.3 ทรัพยากร 5
1.3.1 สื่อประเภท 6
1.3.2 URI 7
1.3.3 URL 7
1.3.4 โกศ 8
1.4 ธุรกรรม 9
1.4.1 วิธี 9
1.4.2 รหัสสถานะ 10
1.4.3 หน้าเว็บสามารถมีหลายวัตถุ 10
1.5 ข้อความ 11
1.6 การเชื่อมต่อ 13
แต่ละบรรทัดมีหมายเลขหน้าและคั่นด้วยช่องว่าง
หลังจากการประมวลผลผลลัพธ์คือ:
ตรรกะหลักคือ:
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ org.fra.pdf.bussiness;
นำเข้า java.io.bufferedreader;
นำเข้า Java.io.FileOutputStream;
นำเข้า java.io.ioException;
นำเข้า java.util.arraylist;
นำเข้า java.util.hashmap;
นำเข้า java.util.list;
นำเข้า java.util.stack;
นำเข้า com.itextpdf.text.documentException;
นำเข้า com.itextpdf.text.pdf.inthashtable;
นำเข้า com.itextpdf.text.pdf.pdfarray;
นำเข้า com.itextpdf.text.pdf.pdfdictionary;
นำเข้า com.itextpdf.text.pdf.pdfindirectreference;
นำเข้า com.itextpdf.text.pdf.pdfname;
นำเข้า com.itextpdf.text.pdf.pdfnumber;
นำเข้า com.itextpdf.text.pdf.pdfobject;
นำเข้า com.itextpdf.text.pdf.pdfreader;
นำเข้า com.itextpdf.text.pdf.pdfstamper;
นำเข้า com.itextpdf.text.pdf.pdfstring;
นำเข้า com.itextpdf.text.pdf.simplebookmark;
คลาสสาธารณะ addpdfoutlinefromtxt {
สแต็คส่วนตัว <OutlineInfo> Parentoutlinestack = New Stack <OutlineInfo> ();
โมฆะสาธารณะ createpdf (สตริง destpdf, สตริง sourcepdf,
bufferedreader bufread, รูปแบบ int) พ่น IOException
DocumentException {
ถ้า (รูปแบบ! = addBookMarkConstants.reserved_old_outline
&& pattern! = addbookmarkconstants.reserved_none
&& pattern! = addBookMarkConstants.reserved_first_outline)
กลับ;
// อ่านในไฟล์ PDF
pdfreader reader = pdfreader ใหม่ (sourcepdf);
รายการ <hashmap <string, object >> outlines = new ArrayList <HASHMAP <String, Object >> ();
if (pattern == AddBookMarkConstants.reserved_old_outline) {
Outlines.addall (SimpleBookMark.getBookmark (ผู้อ่าน));
} else if (pattern == addbookmarkConstants.reserved_first_outline) {
addfirstoutlinereservedpdf (โครงร่าง, ผู้อ่าน);
-
addBookMarks (bufread, โครงร่าง, null, 0);
// สร้าง Stamper ใหม่
pdfstamper stamper = ใหม่ pdfstamper (ตัวอ่าน, ใหม่ fileOutputStream (
destpdf));
Stamper.setOutlines (โครงร่าง);
Stamper.close ();
-
Void Private AddBookMarks (BufferedReader Bufread,
รายการ <hashmap <string, object >> โครงร่าง
hashmap <string, object> preoutline, int prelevel)
โยน ioexception {
สตริง contentFormatline = null;
bufread.mark (1);
if ((contentFormatline = bufread.readline ())! = null) {
formattedBookmark bookmark = parseformattedText (contentFormatline);
hashmap <string, object> map = parsebookmarktohashmap (บุ๊กมาร์ก);
ระดับ int = bookmark.getLevel ();
// ถ้า n == m แล้วมันเป็นเลเยอร์เดียวกัน
ถ้า (ระดับ == prelevel) {
Outlines.add (แผนที่);
AddBookMarks (bufread, โครงร่าง, แผนที่, ระดับ);
-
// ถ้า n> m ดังนั้นก็แน่นอนว่าบรรทัดเป็นลูกของบรรทัดก่อนหน้าใหม่เด็กอาร์เรย์ลิสต์และเพิ่มเข้าไปใน arraylist นี้
อื่นถ้า (ระดับ> prelevel) {
รายการ <hashmap <string, object >> kids = new ArrayList <hashmap <string, object >> ();
Kids.Add (แผนที่);
preoutline.put ("เด็ก", เด็ก ๆ );
// บันทึกข้อมูลโครงร่างเกี่ยวกับเด็ก
parentoutlinestack.push (ใหม่ OutlineInfo (preoutline, โครงร่าง,
prelevel));
addbookmarks (bufread, เด็ก, แผนที่, ระดับ);
-
// ถ้า n <m นั่นหมายความว่าเด็กได้รับการเพิ่มและกลับสู่ระดับบนและ Bufread จะกลับไปที่บรรทัด
อื่นถ้า (ระดับ <prelevel) {
bufread.reset ();
OutlineInfo OBJ = parentoutlinestack.pop ();
addBookMarks (bufread, obj.getoutlines (), obj.getpreoutline (),
obj.getPrelevel ());
-
-
-
HashMap ส่วนตัว <String, Object> ParseBookMarkToHashMap (
บุ๊คมาร์ค formattedBookMark) {
hashmap <string, object> map = new hashmap <string, object> ();
map.put ("title", bookmark.gettitle ());
map.put ("การกระทำ", "goto");
map.put ("หน้า", bookmark.getPage () + "พอดี");
แผนที่กลับ;
-
private formatedBookmark parseformattedText (String ContentFormatline) {
bookmark formattedbookmark = new FormattedBookmark ();
String title = "";
String destPage = "";
// เมื่อไม่มีหมายเลขหน้าในตอนท้ายของสตริงมักจะเป็นชื่อของหนังสือหากรูปแบบถูกต้อง
int lastspaceindex = contentFormatline.lastindexof ("");
if (LastSpaceIndex == -1) {
title = contentFormatline;
destPage = "1";
} อื่น {
title = contentFormatline.substring (0, LastSpaceIndex);
destPage = contentFormatline.substring (LastSpaceIndex + 1);
-
String [] titleSplit = title.split ("");
int dotCount = titleSplit [0] .split ("//."). ความยาว - 1;
bookmark.setlevel (dotcount);
Bookmark.setPage (Destpage);
Bookmark.settitle (ชื่อ);
บุ๊คมาร์คกลับ;
-
โมฆะส่วนตัว addfirstoutlinereservedpdf (
รายการ <hashmap <string, object >> lotines, pdfreader reader) {
แคตตาล็อก pdfdictionary = reader.getCatalog ();
pdfobject obj = pdfreader.getpdfobjectrelease (แคตตาล็อก
.get (pdfname.outlines));
// ไม่มีบุ๊คมาร์ค
if (obj == null ||! obj.isdictionary ())
กลับ;
PDFDICTIONARY OUTLINESDICTIONARY = (PDFDICTIONARY) OBJ;
// รับบุ๊คมาร์คแรก
pdfdictionary firstoutline = (pdfdictionary) pdfreader
.getPdFoBJectrelease (OutlinesDictionary.get (pdfname.first));
pdfString titleObj = firstoutline.getAsstring ((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 (การกระทำ
.get (pdfname.s)))) {
dest = (pdfarray) pdfreader.getpdfobjectrelease (การกระทำ
.get (pdfname.d));
-
-
-
String destStr = parsedestString (dest, reader);
String [] decodestr = destStr.split ("");
int num = integer.valueof (decodestr [0]);
hashmap <string, object> map = new hashmap <string, object> ();
map.put ("title", ชื่อเรื่อง);
map.put ("การกระทำ", "goto");
map.put ("หน้า", num + "พอดี");
Outlines.add (แผนที่);
-
Private String ParsedestString (PDFARRAY DEST, PDFREADER Reader) {
String destStr = "";
if (dest.isstring ()) {
DESTSTR = DEST.TOSTRING ();
} อื่นถ้า (dest.isname ()) {
destStr = pdfname.decodename (dest.toString ());
} อื่นถ้า (dest.isarray ()) {
หน้าเว็บ = new inthashtable ();
int numpages = reader.getNumberOfPages ();
สำหรับ (int k = 1; k <= numpages; ++ k) {
pages.put (reader.getPageOrigref (k) .getNumber (), k);
Reader.releasePage (K);
-
destStr = makebookmarkparam ((pdfarray) dest, หน้า);
-
กลับ Deststr;
-
สตริงส่วนตัว makebookmarkparam (pdfarray dest, หน้า inthashtable) {
StringBuffer S = new StringBuffer ();
pdfobject obj = dest.getpdfobject (0);
if (obj.isnumber ()) {
S.Append (((pdfnumber) obj) .intvalue () + 1);
} อื่น {
S.Append (pages.get (getNumber ((pdfindirectreference) OBJ)));
-
S.Append ('') .Append (dest.getPdFObject (1) .toString (). substring (1));
สำหรับ (int k = 2; k <dest.size (); ++ k) {
S.Append ('') .Append (dest.getPdfObject (k) .toString ());
-
กลับ s.toString ();
-
private int getNumber (pdfindirectreference ทางอ้อม) {
pdfdictionary pdfobj = (pdfdictionary) pdfreader
.getPdFoBjectrelease (ทางอ้อม);
if (pdfobj.contains (pdfname.type)
&& pdfobj.get (pdfname.type) .equals (pdfname.pages)
&& pdfobj.contains (pdfname.kids)) {
pdfarray kids = (pdfarray) pdfobj.get (pdfname.kids);
ทางอ้อม = (pdfindirectreference) kids.getpdfobject (0);
-
ส่งคืนทางอ้อม getNumber ();
-
-