Dado que a menudo descargo algunos libros electrónicos en formato PDF, a veces algunos libros buenos no tienen marcadores al descargar, y no se siente como una lectura completa, así que decidí escribir un gadget yo mismo, analizar el texto en un formato específico en un formato específico. un marcador, y luego guárdelo en formato PDF.
La idea general es copiar la información del directorio de las presentaciones a continuación Douban, JD.com, Dangdang y Amazon.
La estructura del directorio es la siguiente:
La copia del código es la siguiente:
Capítulo 1 Descripción general de HTTP 3
1.1 HTTP-Internet's Multimedia Messenger 4
1.2 Cliente web y servidor 4
1.3 Recurso 5
1.3.1 Tipo de medios 6
1.3.2 Uri 7
1.3.3 URL 7
1.3.4 Urna 8
1.4 Transacción 9
1.4.1 Método 9
1.4.2 Código de estado 10
1.4.3 Las páginas web pueden contener múltiples objetos 10
1.5 Mensaje 11
1.6 Conexión 13
Cada línea tiene números de página y está separado por espacios.
Después del procesamiento, el resultado es:
La lógica principal es:
La copia del código es la siguiente:
paquete org.fra.pdf.bussiness;
import java.io.bufferedReader;
import java.io.fileOutputStream;
import java.io.ioException;
import java.util.arrayList;
import java.util.hashmap;
import java.util.list;
import java.util.stack;
import com.itextpdf.text.documentException;
import com.itextpdf.text.pdf.intashtable;
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;
clase pública addpdfoutlineFromTxt {
pila privada <utlineInfo> ParentOutLinestack = new Stack <OutlineInfo> ();
public void CreatePDF (String Destpdf, String SourcePDF,
BufferedReader Bufread, int patrón) lanza ioexception,
DocumentException {
if (patrón! = addbookmarkConstants.reserved_old_outline
&& patrón! = addbookmarkConstants.reserved_none
&& patrón! = addbookmarkConstants.reserved_first_outline)
devolver;
// Leer en el archivo PDF
PDFreader Reader = nuevo PDFreader (SourcePDF);
List <Hashmap <String, Object >> Outlines = new ArrayList <Hashmap <String, Object >> ();
if (patrón == addbookmarkConstants.reserved_old_outline) {
Outlines.addall (simpleBookmark.getBookmark (lector));
} else if (patrón == addbookmarkConstants.reserved_first_outline) {
addFirstoutLinereServedPDF (esquemas, lector);
}
addBookMarks (Bufread, esquemas, nulo, 0);
// crear un nuevo estampador
PDFStamper Stamper = new PDFStamper (lector, nuevo FileOutputStream (
destpdf));
Stamper.SetOutLines (contornos);
Stamper.Close ();
}
Private void addbookmarks (BufferedReader Bufread,
Lista <Hashmap <String, Object >> Outros,
Hashmap <string, object> preoutline, int prelevel)
lanza ioexception {
String ContentFormatline = null;
Bufread.mark (1);
if ((contentformatline = bufread.readline ())! = null) {
FormattedBookmark Bookmark = ParseFormattedText (ContentFormatline);
Hashmap <string, object> map = parseBookmarkToHashMap (Bookmark);
int nivel = bookmark.getLevel ();
// Si n == m, entonces es de la misma capa.
if (nivel == prelevel) {
esquemas.add (mapa);
addBookMarks (BUFREAD, esquemas, mapa, nivel);
}
// Si n> m, entonces es seguro que la línea es el hijo de la línea anterior, una lista de matrices nueva para niños y se agregó a esta ArrayList
else if (nivel> prelevel) {
List <Hashmap <String, Object >> Kids = New ArrayList <Hashmap <String, Object >> ();
niños.add (mapa);
preoutline.put ("niños", niños);
// Registro de información sobre el esquema sobre los niños
ParentOutlinestack.push (nuevo OutlineInfo (línea previa, contornos,
prelevel));
AddBookMarks (Bufread, Kids, Map, Nivel);
}
// Si n <m, entonces significa que el niño ha sido agregado y devuelto al nivel superior, y Bufread volverá a la línea
else if (nivel <prelevel) {
bufread.reset ();
OutlineInfo obj = ParentOutLinestack.pop ();
addBookMarks (bufread, obj.getOutLines (), obj.getPReoutline (),,
obj.getPrelevel ());
}
}
}
Hashmap privado <String, Object> ParseBookmarkToHashMap (
FormattedBookmark Bookmark) {
Hashmap <string, object> map = new HashMap <String, Object> ();
map.put ("title", bookmark.gettitle ());
map.put ("acción", "goto");
map.put ("página", bookmark.getPage () + "Fit");
mapa de retorno;
}
Private FormattedBookmark ParseFormattedText (String ContentFormatline) {
Formattedbookmark bookmark = new FormattedBookmark ();
Title de cadena = "";
Cadena destpage = "";
// Cuando no hay un número de página al final de la cadena, generalmente es el nombre del libro, si el formato es correcto.
int LastSpaceIndex = ContentFormatline.lastIndexof ("");
if (lastspaceIndex == -1) {
Title = ContentFormAtline;
destpage = "1";
} demás {
title = contentFormatline.substring (0, LastSpaceIndex);
destpage = contentformatline.substring (lastspaceIndex + 1);
}
String [] titlesplit = title.split ("");
int dotCount = titlesplit [0] .split ("//."). Longitud - 1;
Bookmark.setLevel (dotcount);
Bookmark.SetPage (DestPage);
marcador.settitle (título);
devolver marcador;
}
Vacío privado addfirstoutLinereServedPDF (
Lista <Hashmap <String, Object >> Outlines, PDFreader Reader) {
PDFDICCIONARY CATÁLOG = Reader.getCatalog ();
Pdfobject obj = pdfeader.getpdfobjectreelease (catálogo
.get (pdfname.outlines));
// no hay marcadores
if (obj == null ||! obj.isDictionary ())
devolver;
PDFDictionary OutlinesDictionary = (PDFDictionary) obj;
// Obtén el primer marcador
PDFDICCIONARY FINTEROUTLINE = (PDFDICCIONARY) PDFREADER
.getpdfobJectrelease (OutlinesDictionary.get (pdfname.first));
PdfString titleOBJ = firstoutline.getAsstring ((pdfname.title));
Title de cadena = 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.getpdfobjectreelease (acción
.get (pdfname.s)))) {
Dest = (PDFArray) PDFReader.getPDFOBJectrelease (Acción
.get (pdfname.d));
}
}
}
Cadena deststr = parsedestString (dest, lector);
String [] decodestr = deststr.split ("");
int
Hashmap <string, object> map = new HashMap <String, Object> ();
map.put ("título", título);
map.put ("acción", "goto");
map.put ("página", num + "ajuste");
esquemas.add (mapa);
}
Cadena privada ParsedestString (PDFArray Dest, PDFeader Reader) {
Cadena DestStr = "";
if (dest.isstring ()) {
deststr = dest.ToString ();
} else if (dest.isname ()) {
deststr = pdfname.DecodeName (dest.ToString ());
} else if (dest.isArray ()) {
Páginas InthashTable = new InthashTable ();
int numperges = lector.getNumberOfPages ();
para (int k = 1; k <= numperges; ++ k) {
pages.put (lector.getPageorigref (k) .getNumber (), k);
lector.releasepage (k);
}
Deststr = MakebookmarkParam ((PDFarray) Dest, páginas);
}
devolver Deststr;
}
Private String MakeBookmarkParam (PDFArray Dest, Páginas InthashTable) {
StringBuffer s = new StringBuffer ();
Pdfobject obj = Dest.getPdfobject (0);
if (obj.isnumber ()) {
S.Append ((((PDFNumber) obj) .intvalue () + 1);
} demás {
S.Append (page.get (getNumber ((PDFindirectreeference) obj)));
}
S.Append ('') .Append (Dest.GetPDFObject (1) .ToString (). Substring (1));
para (int k = 2; k <dest.size (); ++ k) {
S.Append ('') .Append (Dest.GetPDFObject (k) .ToString ());
}
return s.toString ();
}
Private int getNumber (PDFindirectreference Indirect) {
PDFDICCIONARY PDFOBJ = (PDFDICCIONARY) PDFREADER
.getpdfobJectrelease (indirecto);
if (pdfobj.contains (pdfname.type)
&& pdfobj.get (pdfname.type) .equals (pdfname.pages)
&& pdfobj.contains (pdfname.kids)) {
PDFArray Kids = (PDFArray) Pdfobj.get (pdfname.kids);
indirect = (pdfindirectreference) niños.getpdfobject (0);
}
return indirect.getNumber ();
}
}