私はPDF形式でいくつかの電子書籍をダウンロードすることが多いので、いくつかの良い本にダウンロード時にブックマークがないこともあれば、読んで全体のように感じないので、自分でガジェットを書いて、特定の形式でテキストを解析することにしましたブックマーク、次にPDF形式で保存します。
全体的なアイデアは、Douban、JD.com、Dangdang、およびAmazonの以下の紹介からディレクトリ情報をコピーすることです。
ディレクトリの構造は次のとおりです。
コードコピーは次のとおりです。
第1章HTTPの概要3
1.1 HTTPインターネットのマルチメディアメッセンジャー4
1.2 Webクライアントとサーバー4
1.3リソース5
1.3.1メディアタイプ6
1.3.2 URI 7
1.3.3 URL 7
1.3.4 URN 8
1.4トランザクション9
1.4.1方法9
1.4.2ステータスコード10
1.4.3 Webページには複数のオブジェクトを含めることができます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をインポートします。
public class addpdfoutlinefromtxt {
Private Stack <OutlineInfo> parentOutlinestack = new Stack <OutlineInfo>();
public void createpdf(string destpdf、string sourcepdf、
bufferedreader bufread、int pattern)ioexceptionをスローする
documentException {
if(pattern!= addbookmarkconstants.reserved_old_outline
&& pattern!= addbookmarkconstants.reserved_none
&& pattern!= addbookmarkconstants.reserved_first_outline)
戻る;
// PDFファイルを読み取ります
pdfreader reader = new PDFreader(sourcePDF);
list <hashmap <string、object >> outlines = new arrayList <hashmap <string、object >>();
if(pattern == addbookmarkconstants.reserved_old_outline){
outlines.addall(simplebookmark.getbookmark(reader));
} else if(pattern == addbookmarkconstants.reserved_first_outline){
AddFirstOutLinererSedPdf(Outlines、Reader);
}
AddbookMarks(bufread、outlines、null、0);
//新しいスタンパーを作成します
pdfstamper stamper = new pdfstamper(reader、new fileoutputStream(
destpdf));
stamper.setoutlines(outlines);
stamper.close();
}
プライベートボイドアドブックマーク(bufferedreader bufread、
list <hashmap <string、object >> outlines、
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(bookmark);
int level = bookmark.getLevel();
// n == mの場合、それは同じレイヤーである。
if(level == prelevel){
outlines.add(map);
AddbookMarks(bufread、outlines、map、level);
}
// n> mの場合、ラインが前のラインの子であることが確かです。
else if(level> prelevel){
list <hashmap <string、object >> kids = new arraylist <hashmap <string、object >>();
kids.add(マップ);
preoutline.put( "kids"、kids);
//子供に関する概要情報を記録します
ParentOutlinestack.push(new OutlineInfo(PreOutline、outlines、
prelevel));
AddbookMarks(bufread、子供、マップ、レベル);
}
// n <mの場合、それは子供が追加されて上位レベルに戻ったことを意味し、bufreadはラインに戻ります
else if(level <prelevel){
bufread.reset();
outlineInfo 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 bookmark = new formattedbookmark();
文字列タイトル= "";
文字列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 = titalsplit [0] .split( "//。")。長さ-1;
bookmark.setlevel(dotcount);
bookmark.setpage(destPage);
bookmark.settitle(title);
ブックマークを返す;
}
private void addFirstOutLinerERESTEDPDF(
リスト<Hashmap <String、Object >> outlines、pdfreader reader){
pdfdictionary catalog = reader.getCatalog();
pdfobject obj = pdfreader.getpdfobjectRelease(Catalog
.get(pdfname.outlines));
//ブックマークなし
if(obj == null ||!obj.isdictionary())
戻る;
pdfdictionary outlines-dictionary =(pdfdictionary)obj;
//最初のブックマークを取得します
pdfdictionary firstoutline =(pdfdictionary)pdfreader
.getpdfobjectRelease(outlinesdictionary.get(pdfname.first));
pdfstring tittiteobj = firstoutline.getAsstring((pdfname.title));
文字列ittitle = 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));
}
}
}
文字列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"、title);
map.put( "action"、 "goto");
map.put( "page"、num + "fit");
outlines.add(map);
}
private string parsedestString(pdfarray dest、pdfreader reader){
文字列deststr = "";
if(dest.isstring()){
deststr = dest.toString();
} else if(dest.isname()){
deststr = pdfname.decodename(dest.tostring());
} else if(dest.isarray()){
Inthashtableページ= 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ページ){
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());
}
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);
}
indirect.getNumber()を返します。
}
}