Поскольку я часто загружаю несколько электронных книг в формате PDF, иногда в некоторых хороших книгах нет закладок при загрузке, и это не похоже на целое чтение, поэтому я решил написать гаджет, разобрать текст в определенном формате в закладка, а затем сохраните ее в формате PDF.
Общая идея состоит в том, чтобы скопировать информацию о каталоге из введений ниже Douban, JD.com, Dangdang и Amazon.
Структура каталога заключается в следующем:
Кода -копия выглядит следующим образом:
Глава 1 HTTP Обзор 3
1.1 Http-Internet Multimedia Messenger 4
1.2 Веб -клиент и сервер 4
1.3 Ресурс 5
1.3.1 Media Type 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;
Import com.itextpdf.text.pdf.inthashtable;
Import com.itextpdf.text.pdf.pdfarray;
Import com.itextpdf.text.pdf.pdfdictionary;
Import com.itextpdf.text.pdf.pdfindirecterference;
Import com.itextpdf.text.pdf.pdfname;
Импорт 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 {
Private Stack <uplineInfo> parentOutlineStack = new Stack <uplineInfo> ();
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);
Список <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) {
addfirstoutlinereservedpdf (Outlines, Reader);
}
addBookmarks (Bufread, Outles, Null, 0);
// Создать новый STAMPER
Pdfstamper stamper = new PdfStamper (Reader, New FileOutputStream (
destpdf));
STAMPER.SetOutlines (Outlines);
stamper.close ();
}
Private void AddBookMarks (BufferedReader Bufread,
Список <hashmap <string, Object >> Ориентирует,
Hashmap <String, Object> Preoutline, Int Prelevel)
бросает ioException {
String contentFormatline = null;
bufread.mark (1);
if ((contentFormatline = bufread.readline ())! = null) {
FormattedBookmark Bookmark = parseFormattedText (ContentFormatline);
Hashmap <String, Object> Map = parsebookmarktohashmap (закладка);
int level = bookmark.getlevel ();
// Если n == M, то это тот же слой.
if (level == prelevel) {
Outlines.Add (map);
addBookmarks (Bufread, Outles, Map, Level);
}
// Если n> m, то уверенность в том, что линия - это ребенок предыдущей строки, новый ArrayList и добавлен в этот массив
иначе if (level> prelevel) {
Список <hashmap <string, object >> kids = new ArrayList <hashmap <String, Object >> ();
Kids.add (Map);
preoutline.put («Дети», дети);
// Записывают информацию о детях
ParentOutlineStack.push (New OutlineInfo (Preoutline, Outlings,
преодолеть));
addBookmarks (Bufread, дети, карта, уровень);
}
// Если N <m, то это означает, что ребенок был добавлен и возвращен на верхний уровень, и Bufread вернется к линии
иначе 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 ();
Строка title = "";
String destpage = "";
// Когда в конце строки нет номера страницы, обычно это имя книги, если формат правильный.
int fastspaceindex = 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 (название);
вернуть закладку;
}
private void addfirstoutlinereservedpdf (
Список <hashmap <string, Object >> Outles, Pdfreader Reader) {
Pdfdictionary catalog = 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.getpdfobjecterelease (действие
.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", title);
map.put ("action", "goto");
map.put ("page", num + "fit");
Outlines.Add (map);
}
Private String 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 ();
для (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 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 ());
}
вернуть 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);
}
return odverct.getNumber ();
}
}