繁体   English   中英

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

[英]itext how to check if giant string is present on the pdf page

-我正在使用IText插件在我的Java项目中创建/读取pdf。 -我正在从任何扩展名(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;

    导入java.io.BufferedReader; 导入java.io.File; 导入java.io.FileReader; 导入java.io.IOException; 导入java.util.Scanner;

    上市...

当我检查文件路径“ PdfGeneratorForSoftwareRegistration / PdfGeneratorForSoftwareRegistration / src / br / ufrn / pairg / pdfgenerator / LeitorArquivoTexto.java”是否存在时,系统未找到它。 你看到问题了吗? 我的路很大,占用了2条线! 那就是问题所在!

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

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的内部内容,则如下所示:

在此处输入图片说明

为了这个示例,我在第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 ...。此规则避免了两家不同的公司引入相同的代码,但含义不同。

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

解决的问题:我正在使用http://www.quicklyjava.com/read-pdf-file-in-java-using-itext/的解决方案获取页码

问题:如果项目中有任何写有#%&#id_0#%&#,#%&#id_1#%&#...的文件,则我的程序将无法运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM