종종 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 웹 페이지에는 여러 객체가 포함될 수 있습니다
1.5 메시지 11
1.6 연결 13
각 라인에는 페이지 번호가 있으며 공백으로 구분됩니다.
처리 후 결과는 다음과 같습니다.
주요 논리는 다음과 같습니다.
코드 사본은 다음과 같습니다.
패키지 org.fra.pdf.bussiness;
import java.io.bufferedReader;
import java.io.fileoutputStream;
import java.io.ioexception;
java.util.arraylist 가져 오기;
java.util.hashmap import;
Java.util.list 가져 오기;
Java.util.stack 가져 오기;
import com.itextpdf.text.documentException;
import com.itextpdf.text.pdf.inthashtable;
import com.itextpdf.text.pdf.pdfarray;
import com.itextpdf.text.pdf.pdfdictionary;
import com.itextpdf.text.pdf.pdfindirectreference;
import com.itextpdf.text.pdf.pdfname;
import com.itextpdf.text.pdf.pdfnumber;
import com.itextpdf.text.pdf.pdfobject;
import com.itextpdf.text.pdf.pdfreader;
import com.itextpdf.text.pdf.pdfstamper;
import com.itextpdf.text.pdf.pdfstring;
import com.itextpdf.text.pdf.simplebookmark;
공개 클래스 addpdfoutlinefromtxt {
개인 스택 <antlineInfo> parentOutlinestack = 새 스택 <antlineInfo> ();
public void createpdf (String destpdf, String sourcepdf,
BufferedReader Bufread, int Pattern) IoException을 던지고,
DocumentException {
if (Pattern! = addBookMarkConstants.Reserved_old_outline
&& 패턴! = AddBookMarkConstants.reserved_none
&& Pattern! = AddBookMarkConstants.Reserved_First_outline)
반품;
// PDF 파일로 읽습니다
pdfreader reader = new PdfReader (sourcepdf);
List <hashmap <string, object >> artamines = new arraylist <hashmap <string, object >> ();
if (pattern == addBookMarkConstants.Reserved_old_outline) {
Arumber.Addall (SimpleBookMark.getBookMark (Reader));
} else if (pattern == addBookMarkConstants.Reserved_first_outline) {
AddFirstoutLinerEservedPDF (개요, 독자);
}
AddBookMarks (bufread, orportines, null, 0);
// 새 스탬퍼를 만듭니다
pdfstamper stamper = new pdfstamper (Reader, New FileOutputStream (
destpdf));
stamper.setoutlines (윤곽선);
stamper.close ();
}
개인 void AddBookmarks (BufferedReader Bufread,
목록 <hashmap <string, object >> 윤곽선,
Hashmap <String, Object> preoutline, int prelevel)
IoException {{
문자열 contentformatline = null;
bufread.mark (1);
if ((contentformatline = bufread.readline ())! = null) {
FormattedBookMark 북마크 = ParseFormattedText (ContentFormatline);
HASHMAP <String, Object> Map = ParseBookMarkToHashMap (Bookmark);
int level = bookmark.getLevel ();
// n == m이면 동일한 레이어입니다.
if (level == prelevel) {
ARMENT.ADD (MAP);
AddBookMarks (bufread, 윤곽선,지도, 레벨);
}
// n> m이라면, 라인이 이전 줄의 자녀, 새로운 a kids arraylist, 그리고이 arraylist에 추가 된 것은 확실합니다.
else if (level> prelevel) {
목록 <hashmap <string, object >> kids = new arraylist <hashmap <string, object >> ();
kids.add (지도);
preoutline.put ( "kids", kids);
// 어린이에 대한 개요 정보를 기록합니다
ParentoutLinestack.push (New OutlineInfo (preoutline, 윤곽선,
prelevel);
AddBookMarks (Bufread, 어린이,지도, 레벨);
}
// n <m이라면, 그것은 아이가 추가되어 상위 레벨로 돌아 왔음을 의미하며, Bufread는 줄로 돌아갑니다.
else if (level <prelevel) {
bufread.reset ();
oldlineinfo obj = parentoutlinestack.pop ();
AddBookMarks (bufread, obj.getoutlines (), obj.getpreoutline (),
obj.getPrelevel ());
}
}
}
Private Hashmap <String, Object> ParsebookmarktoHashmap (
FormattedBookmark 북마크) {
Hashmap <String, Object> Map = New Hashmap <String, Object> ();
map.put ( "title", bookmark.getTitle ());
map.put ( "action", "goto");
map.put ( "page", bookmark.getPage () + "fit");
리턴 맵;
}
private FormattedBookmark parseformattedText (String ContentFormatline) {
FormattedBookmark 북마크 = 새로운 형식의 책 마크 ();
문자열 제목 = "";
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 = TITELESPLIT [0] .SPLIT ( "//"). 길이 -1;
Bookmark.SetLevel (DotCount);
Bookmark.setPage (DEMPAGE);
Bookmark.SetTitle (제목);
반환 북마크;
}
개인 void addfirstoutlinereservedpdf (
목록 <hashmap <string, object >> 윤곽선, pdfreader reader) {
pdfdictionary 카탈로그 = reader.getCatalog ();
pdfobject obj = pdfreader.getpdfobjectRelease (카탈로그
.get (pdfname.outlines));
// 북마크가 없습니다
if (obj == null ||! obj.isdictionary ())
반품;
pdfdictionary troldinesdictionary = (pdfdictionary) obj;
// 첫 번째 북마크를 가져옵니다
pdfdictionary firstOutline = (pdfdictionary) pdfreader
.getpdfobjectRelease (ortorminesdictionary.get (pdfname.first));
pdfstring titleobj = firstOutline.getAsstring ((pdfname.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 (action
.get (pdfname.s)))) {
dest = (pdfarray) pdfreader.getpdfobjectRelease (action
.get (pdfname.d));
}
}
}
String deststr = parsedeststring (Dest, Reader);
문자열 [] decodest = deststr.split ( "");
int num = integer.valueof (decodest [0]);
Hashmap <String, Object> Map = New Hashmap <String, Object> ();
map.put ( "제목", 제목);
map.put ( "action", "goto");
map.put ( "page", num + "fit");
ARMENT.ADD (MAP);
}
개인 문자열 parsedestString (pdfarray dest, pdfreader 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 ();
for (int k = 1; k <= numpages; ++ k) {
pages.put (reader.getPageOrigRef (k) .getNumber (), k);
reader.releasepage (k);
}
deststr = makebookmarkparam ((pdfarray) dest, pages);
}
반환 deststr;
}
개인 문자열 makebookmarkparam (pdfarray dest, inthashtable pages) {
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));
for (int k = 2; k <dest.size (); ++ k) {
s.append ( '') .append (dest.getpdfobject (k) .toString ());
}
return s.tostring ();
}
개인 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);
}
return indirect.getNumber ();
}
}