我的文件夹中有900个文件,其格式为.pdf格式。我必须将.pdf逐个转换为.csv并将这些csv存储在另一个文件夹中

时间:2019-06-24 12:02:30

标签: java itext

在这里,我正在处理一个文件并存储在另一个文件夹中。对于多个文件该怎么办?

try 
{ 
     Document document = new Document();
     document.open();
     FileOutputStream fos=new FileOutputStream("C:\\Users\\user\\Desktop\\pdf\\MyCSVFile.csv");
     StringBuilder parsedText=new StringBuilder();
     PdfReader reader1 = new PdfReader("C:\\Users\\user\\Desktop\\pdf\\NL-26.pdf");
     int n = reader1.getNumberOfPages();
     for (int i = 0; i <n ; i++) 
     {
        parsedText.append(parsedText+PdfTextExtractor.getTextFromPage(reader1, i+1).trim()+"\n") ;
     }
     StringReader stReader = new StringReader(parsedText.toString());
     int t;
     while((t=stReader.read())>0)
         fos.write(t);
         document.close();

3 个答案:

答案 0 :(得分:1)

您可以使用this获取给定目录下的所有文件:

final File folder = new File("C:\\Users\\user\\Desktop\\pdf");
final File[] listOfFiles = folder.listFiles();

for (int i = 0; i < listOfFiles.length; i++) {
    final File file = listOfFiles[i];
    if (file.isFile() && file.getAbsolutePath().endsWith(".pdf")) {
        parsePdf("C:\\Users\\user\\Desktop\\pdf\\MyCSVFile"+i+".csv", file.getAbsolutePath());
    }
}

如果将业务逻辑重构为单独的方法,则可以从if中使用它。

private static void parsePdf(final String fileToWrite, final String fileToRead) throws IOException {
    try (FileOutputStream fos = new FileOutputStream(fileToWrite)) {
        final StringBuilder parsedText = new StringBuilder();
        final PdfReader reader1 = new PdfReader(fileToRead);
        int n = reader1.getNumberOfPages();
        for (int i = 0; i < n; i++) {
            parsedText.append(parsedText + PdfTextExtractor.getTextFromPage(reader1, i + 1).trim() + "\n");
        }
        final StringReader stReader = new StringReader(parsedText.toString());
        int t;
        while ((t = stReader.read()) > 0)
            fos.write(t);
    }
}

答案 1 :(得分:0)

可以执行以下操作:

public static void convertAllCSV(String directory)
{
    try 
    {
        ArrayList<String> files = findFiles(directory); //Returns list of all files in folder with .pdf extension

        for (String s : files)
        {
            convertSingleCSV(s, directory); //Your current code placed into a method
        }
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }   
}

使用findFiles方法,如下所示:

public static ArrayList<String> findFiles(String directory) throws IOException
{
    ArrayList<String> fileList = new ArrayList<String>();
    File dir = new File(directory);

    String ext = ".pdf";
    String[] files = dir.list();
    for (String file : files)
    {
        //If the file ends with .pdf
        if(file.endsWith(ext))
        {
            fileList.add(file);
        }
    }
    return fileList;
}

基本上需要添加2个步骤。您需要传递目录名称,并在目录中找到扩展名为.pdf的所有文件,然后使用它通过循环一次调用一个原始方法。

convertSingleCSV是将代码放入方法中,然后使用文件名和目录输出新文件。因此,您无需执行FileOutputStream的硬编码名称,只需执行以下操作即可将其转换:

String fileNameNoExtension = fileName.substring(0, fileName.lastIndexOf('.'));  //Cuts off the file extension to append csv instead of pdf
FileOutputStream fos = new FileOutputStream(directory + "\\" + fileNameNoExtension + ".csv")

这样做的好处是您保留了原始文件名,而只是创建了一个扩展名为.csv的新文件,它只会尝试转换任何.pdf文件,而您不会必须担心确保其他文件不在传递的目录中。

答案 2 :(得分:0)

从Java 7开始,您还可以使用java.nio库:

try(DirectoryStream<Path> stream = Files.newDirectoryStream(Path.of("C:\\Users\\user\\Desktop\\pdf\\"), "*.pdf")) {
    stream.forEach(path -> {
        // process the current PDF file (path.toFile to access java.io.File)
    });
} catch (IOException ex) {
    // fail !
}