根据文本将PDF拆分为单独的文件

beg*_*er_ 4 pdf split

我有一个大的单个pdf文档,其中包含多个记录.每个记录通常占用一页,但有些使用2页.记录以定义的文本开头,始终相同.

我的目标是将这个pdf分成单独的pdf,并且应该在找到"标题文本"之前发生拆分.

注意:我正在寻找使用java或python的工具或库.必须是免费的并且可用Win 7.

有任何想法吗?AFAIK imagemagick不适用于此.可以itext这样做吗?我从来没用过,而且非常复杂所以需要一些提示.

编辑:

标记答案让我解决了问题.为了完整性,我的确切实施:

public void splitByRegex(String filePath, String regex,
        String destinationDirectory, boolean removeBlankPages) throws IOException,
        DocumentException {

    logger.entry(filePath, regex, destinationDirectory);
    destinationDirectory = destinationDirectory == null ? "" : destinationDirectory;
    PdfReader reader = null;
    Document document = null;
    PdfCopy copy = null;
    Pattern pattern = Pattern.compile(regex);        

    try {
        reader = new PdfReader(filePath);
        final String RESULT = destinationDirectory + "/record%d.pdf";
        // loop over all the pages in the original PDF
        int n = reader.getNumberOfPages();
        for (int i = 1; i < n; i++) {

            final String text = PdfTextExtractor.getTextFromPage(reader, i);
            if (pattern.matcher(text).find()) {
                if (document != null && document.isOpen()) {
                    logger.debug("Match found. Closing previous Document..");
                    document.close();
                }
                String fileName = String.format(RESULT, i);
                logger.debug("Match found. Creating new Document " + fileName + "...");
                document = new Document();
                copy = new PdfCopy(document,
                        new FileOutputStream(fileName));
                document.open();
                logger.debug("Adding page to Document...");
                copy.addPage(copy.getImportedPage(reader, i));

            } else if (document != null && document.isOpen()) {
                logger.debug("Found Open Document. Adding additonal page to Document...");
                if (removeBlankPages && !isBlankPage(reader, i)){
                    copy.addPage(copy.getImportedPage(reader, i));
                }
            }
        }
        logger.exit();
    } finally {
        if (document != null && document.isOpen()) {
            document.close();
        }
        if (reader != null) {
            reader.close();
        }
    }
}

private boolean isBlankPage(PdfReader reader, int pageNumber)
        throws IOException {

    // see http://itext-general.2136553.n4.nabble.com/Detecting-blank-pages-td2144877.html
    PdfDictionary pageDict = reader.getPageN(pageNumber);
    // We need to examine the resource dictionary for /Font or
    // /XObject keys.  If either are present, they're almost
    // certainly actually used on the page -> not blank.
    PdfDictionary resDict = (PdfDictionary) pageDict.get(PdfName.RESOURCES);
    if (resDict != null) {
        return resDict.get(PdfName.FONT) == null
                && resDict.get(PdfName.XOBJECT) == null;
    } else {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

mkl*_*mkl 5

您可以使用iText为您的需求创建工具.

无论何时您正在寻找有关iText库(当前版本)的代码示例,您都应该参考iText in Action - 2nd Edition中的代码示例,这些代码样本可以在线访问,也可以从这里按关键字搜索.

在您的情况下,相关示例是Burst.javaExtractPageContentSorted2.java.

Burst.java展示了如何在多个较小的PDF中拆分一个PDF.中央代码:

PdfReader reader = new PdfReader("allrecords.pdf");
final String RESULT = "record%d.pdf";

// We'll create as many new PDFs as there are pages
Document document;
PdfCopy copy;
// loop over all the pages in the original PDF
int n = reader.getNumberOfPages();
for (int i = 0; i < n; ) {
    // step 1
    document = new Document();
    // step 2
    copy = new PdfCopy(document,
            new FileOutputStream(String.format(RESULT, ++i)));
    // step 3
    document.open();
    // step 4
    copy.addPage(copy.getImportedPage(reader, i));
    // step 5
    document.close();
}
reader.close();
Run Code Online (Sandbox Code Playgroud)

此示例将PDF拆分为单页PDF.在您的情况下,您需要按不同的标准拆分.但这只意味着在循环中,您有时必须添加多个导入的页面(从而将循环索引和页码解耦为导入).

要识别新数据集在哪些页面上启动,请受ExtractPageContentSorted2.java的启发.此示例显示如何将页面的文本内容解析为字符串.中央代码:

PdfReader reader = new PdfReader("allrecords.pdf");
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
    System.out.println("\nPage " + i);
    System.out.println(PdfTextExtractor.getTextFromPage(reader, i));
}
reader.close();
Run Code Online (Sandbox Code Playgroud)

只需搜索记录开始文本:如果页面中的文本包含它,则会从那里开始新记录.