itext如何检查pdf页面上是否存在巨型字符串

时间:2015-09-11 15:39:34

标签: java pdf itext itextpdf

- 我正在使用IText插件在我的java项目上创建/读取pdfs。 - 我正在从任何扩展名(pdf,doc,word等)中读取多个文本文件,并将其内容写在新的pdf上(所有文件的所有内容连接在一起) - 要分隔巨型pdf上每个文件的每个内容,我总是开始一个新页面,在新页面的开头用红色写出文件的确切路径,然后写出文件的内容

问题:

  • 我想写这个文件在这个pdf上有多少页面
  • 如何检查pdf页面上是否存在字符串?我有所有文件路径,所以我想检查是否有任何路径写在页面上
  • 我正在按照本教程提取我的任何网页的字符串:http://www.quicklyjava.com/read-pdf-file-in-java-using-itext/
  • 但是,当我提取所有页面并检查是否存在我的文件路径在页面上时(执行string.contains(...)),系统找不到我的文件路径pdf页面!我已经检查了为什么会发生这种情况,当我输出一个页面的字符串时,就像这样:

    1。 PdfGeneratorForSoftwareRegistration / PdfGeneratorForSoftwareRegistration / SRC / BR / ufrn / pairg /的pdfGenerator / LeitorArquivoTexto.java 包br.ufrn.pairg.pdfgenerator;

    import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Scanner;

    ...公共

当我检查文件路径是否为“PdfGeneratorForSoftwareRegistration / PdfGeneratorForSoftwareRegistration / src / br / ufrn / pairg / pdfgenerator / LeitorArquivoTexto.java“出现在这个巨大的字符串中,系统没有找到它。你能看到问题吗?我的路径是如此之大,占据了2行!这就是问题!< / p>

所以,我的问题是:有没有办法使用itext插件检查pdf文本中是否存在一个巨大的字符串?

2 个答案:

答案 0 :(得分:0)

这不是最好的解决方案,但我通过在我的第一个pdf上的每个路径名称上写下一个神奇的ID(例如“#%&amp;#id_0#%&amp;#”)来解决它。然后,我再次阅读pdf并检查是否有id。如果有,我将它与我的文件路径相关联。

问题解决了:我使用http://www.quicklyjava.com/read-pdf-file-in-java-using-itext/

的解决方案获取页码

问题:如果项目中有#%&amp;#id_0#%&amp;#,#%&amp;#id_1#%&amp;#...写在其上的任何文件,我的程序将无效。

答案 1 :(得分:0)

PDF文件中的页面使用页面树进行组织。页面树的每个叶子是具有键和值的页面字典。您可以将自定义条目添加到页面字典中,如下所示:

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    document.add(new Paragraph("Page 1"));
    document.newPage();
    document.add(new Paragraph("Page 2"));
    document.newPage();
    document.add(new Paragraph("Page 3"));
    document.newPage();
    document.add(new Paragraph("Page 4"));
    writer.addPageDictEntry(new PdfName("ITXT_PageMarker"), new PdfString("Marker for page 4"));
    document.newPage();
    document.add(new Paragraph("Page 5"));
    document.newPage();
    document.add(new Paragraph("Page 6"));
    writer.addPageDictEntry(new PdfName("ITXT_PageMarker"), new PdfName("PageMarker"));
    document.newPage();
    document.add(new Paragraph("Page 7"));
    writer.addPageDictEntry(new PdfName("ITXT_PageMarker"), new PdfNumber(7));
    document.newPage();
    document.add(new Paragraph("Page 8"));
    document.close();
}

如果你查看PDF,这看起来像这样:

enter image description here

为了这个例子,我添加了第4页的PDF字符串,第6页的PDF名称和第7页的PDF编号。

您可以检查是否存在此自定义键:

public void check(String filename) throws IOException {
    PdfReader reader = new PdfReader(filename);
    PdfDictionary pagedict;
    for (int i = 1; i < reader.getNumberOfPages(); i++) {
        pagedict = reader.getPageN(i);
        System.out.println(pagedict.get(new PdfName("ITXT_PageMarker")));
    }
    reader.close();
}

check()的输出如下:

null
null
null
Marker for page 4
null
/PageMarker
7

重要事项:除了ISO 32000中定义的内容之外,您不能只为发明 PDF语法的新密钥。但是,如果您创建自己的自定义密钥,则可以创建自己的自定义密钥。用ISO注册4位数代码。例如:Adobe注册ADBE,iText注册ITXT,...如果您引入新的自定义键,则应使用ISO注册的代码作为前缀。例如:在iText,我们可以使用ITXT_PageMarkerITXT_customITXT_Whatever,...此规则可以避免两个不同的公司引入具有不同含义的相同代码。