From aa2e15d846cdee90b70ea882747148b14f257c49 Mon Sep 17 00:00:00 2001 From: reger Date: Sun, 5 Oct 2014 20:05:03 +0200 Subject: [PATCH 1/2] allow url parameter in worktable apicall allow url=wwwl?param=a¶m=b (with ?, & encoded) fix: http://mantis.tokeek.de/view.php?id=100 fix double adding of '&' in MultiProtocolURL.escape() --- .../net/yacy/document/parser/pdfParser.java | 50 +++++++++++++++--- .../yacy/document/parser/pdfParserTest.java | 46 ++++++++++++++++ test/parsertest/umlaute_linux.pdf | Bin 11481 -> 25707 bytes 3 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 test/net/yacy/document/parser/pdfParserTest.java diff --git a/source/net/yacy/document/parser/pdfParser.java b/source/net/yacy/document/parser/pdfParser.java index af2d0e200..1613eb8bf 100644 --- a/source/net/yacy/document/parser/pdfParser.java +++ b/source/net/yacy/document/parser/pdfParser.java @@ -33,14 +33,22 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; import java.util.Date; +import java.util.List; import org.apache.pdfbox.exceptions.CryptographyException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentInformation; +import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.encryption.AccessPermission; import org.apache.pdfbox.pdmodel.encryption.BadSecurityHandlerException; import org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial; +import org.apache.pdfbox.pdmodel.interactive.action.type.PDAction; +import org.apache.pdfbox.pdmodel.interactive.action.type.PDActionURI; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink; import org.apache.pdfbox.util.PDFTextStripper; import net.yacy.cora.document.id.AnchorURL; @@ -135,9 +143,10 @@ public class pdfParser extends AbstractParser implements Parser { } final CharBuffer writer = new CharBuffer(odtParser.MAX_DOCSIZE); byte[] contentBytes = new byte[0]; + Collection pdflinks = null; try { // create a writer for output - final PDFTextStripper stripper = new PDFTextStripper(); + final PDFTextStripper stripper = new PDFTextStripper("UTF-8"); stripper.setEndPage(3); // get first 3 pages (always) writer.append(stripper.getText(pdfDoc)); @@ -162,10 +171,9 @@ public class pdfParser extends AbstractParser implements Parser { if (t.isAlive()) t.interrupt(); } contentBytes = writer.getBytes(); // get final text before closing writer + pdflinks = extractPdfLinks(pdfDoc); } catch (final Throwable e) { - // close the writer - if (writer != null) try { writer.close(); } catch (final Exception ex) {} - try {pdfDoc.close();} catch (final Throwable ee) {} + // close the writer (in finally) //throw new Parser.Failure(e.getMessage(), location); } finally { try {pdfDoc.close();} catch (final Throwable e) {} @@ -207,13 +215,43 @@ public class pdfParser extends AbstractParser implements Parser { null, 0.0f, 0.0f, contentBytes, - null, + (pdflinks == null || pdflinks.isEmpty()) ? null : pdflinks, null, null, false, docDate)}; } - + + /** + * extract clickable links from pdf + * @param pdf the document to parse + * @return all detected links + */ + private Collection extractPdfLinks(final PDDocument pdf) { + final Collection pdflinks = new ArrayList(); + @SuppressWarnings("unchecked") + List allPages = pdf.getDocumentCatalog().getAllPages(); + for (PDPage page : allPages) { + try { + List annotations = page.getAnnotations(); + if (annotations != null) { + for (PDAnnotation pdfannotation : annotations) { + if (pdfannotation instanceof PDAnnotationLink) { + PDAction link = ((PDAnnotationLink)pdfannotation).getAction(); + if (link != null && link instanceof PDActionURI) { + PDActionURI pdflinkuri = (PDActionURI) link; + String uristr = pdflinkuri.getURI(); + AnchorURL url = new AnchorURL(uristr); + pdflinks.add(url); + } + } + } + } + } catch (IOException ex) {} + } + return pdflinks; + } + public static void clean_up_idiotic_PDFParser_font_cache_which_eats_up_tons_of_megabytes() { // thank you very much, PDFParser hackers, this font cache will occupy >80MB RAM for a single pdf and then stays forever // AND I DO NOT EVEN NEED A FONT HERE TO PARSE THE TEXT! diff --git a/test/net/yacy/document/parser/pdfParserTest.java b/test/net/yacy/document/parser/pdfParserTest.java new file mode 100644 index 000000000..e2c419035 --- /dev/null +++ b/test/net/yacy/document/parser/pdfParserTest.java @@ -0,0 +1,46 @@ +package net.yacy.document.parser; + +import java.io.File; +import java.io.FileInputStream; +import java.util.Collection; +import static junit.framework.TestCase.assertEquals; +import net.yacy.cora.document.id.AnchorURL; +import net.yacy.document.Document; +import org.junit.Test; + +public class pdfParserTest { + + /** + * Test extraction of links in parse method, of class pdfParser. + */ + @Test + public void testParse() throws Exception { + System.out.println("pdfParser.parse"); + + final String testFiles = "umlaute_linux.pdf"; + final String mimetype = "application/pdf"; + final String charset = null; + + //final String resulttxt = "In München steht ein Hofbräuhaus. Dort gibt es Bier aus Maßkrügen."; + final String filename = "test/parsertest/" + testFiles; + final File file = new File(filename); + + final AnchorURL url = new AnchorURL("http://localhost/" + filename); + System.out.println("parse file: " + filename); + + pdfParser p = new pdfParser(); + final Document[] docs = p.parse(url, mimetype, charset, new FileInputStream(file)); + + Document doc = docs[0]; + int ilinks = doc.getAnchors().size(); + assertEquals("number of links in pdf", 1, ilinks); + + Collection links = doc.getAnchors(); + System.out.println("number of links detected = " + ilinks); + for (AnchorURL aurl : links) { + System.out.println(" found: " + aurl.toString()); + } + + } + +} diff --git a/test/parsertest/umlaute_linux.pdf b/test/parsertest/umlaute_linux.pdf index 7e6925ee4d9d6bd1421328d2249670a7a2f4ad89..65fe8487b4490a16f10bea3f9f77949188af3ab1 100755 GIT binary patch literal 25707 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 HP4RyKJ?@+1 delta 10702 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 From 59c6532a65470d591fc7955208d3eb0dd5d3b2e5 Mon Sep 17 00:00:00 2001 From: reger Date: Mon, 6 Oct 2014 04:51:31 +0200 Subject: [PATCH 2/2] add link extraction to pdfParser this extracts clickable links in pdf and adds it to the list of links include a test case for this function this is the corrected comment for commit: https://gitorious.org/yacy/rc1/commit/aa2e15d846cdee90b70ea882747148b14f257c49 --- source/net/yacy/document/parser/pdfParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/net/yacy/document/parser/pdfParser.java b/source/net/yacy/document/parser/pdfParser.java index 1613eb8bf..7b5daaba7 100644 --- a/source/net/yacy/document/parser/pdfParser.java +++ b/source/net/yacy/document/parser/pdfParser.java @@ -173,7 +173,7 @@ public class pdfParser extends AbstractParser implements Parser { contentBytes = writer.getBytes(); // get final text before closing writer pdflinks = extractPdfLinks(pdfDoc); } catch (final Throwable e) { - // close the writer (in finally) + //close the writer (in finally) //throw new Parser.Failure(e.getMessage(), location); } finally { try {pdfDoc.close();} catch (final Throwable e) {}