--痛苦

EPBU/MOBI转PDF-LMLPHP

--不爱BB 直接上码。 

 

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

public class EbookConverter {

    public static void main(String[] args) {
        try {
            // 桌面路径
            String userHome = System.getProperty("user.home");
            String desktopPath = userHome + File.separator + "Desktop";

            // 输入文件名(包括扩展名)
            String inputFileName = "example.epub"; // 修改为实际文件名

            // 输入文件路径
            String inputFilePath = desktopPath + File.separator + inputFileName;

            // 输出文件路径(更改扩展名为 .pdf)
            String outputFileName = inputFileName.substring(0, inputFileName.lastIndexOf('.')) + ".pdf";
            String outputFilePath = desktopPath + File.separator + outputFileName;

            // 转换文件
            convertEbookToPdf(inputFilePath, outputFilePath);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void convertEbookToPdf(String inputFilePath, String outputFilePath) throws IOException, InterruptedException {
        // 判断文件格式
        String fileExtension = getFileExtension(inputFilePath).toLowerCase();

        if (!fileExtension.equals("epub") && !fileExtension.equals("mobi")) {
            throw new IllegalArgumentException("Unsupported file format. Only EPUB and MOBI are supported.");
        }

        // 使用 Calibre 的 ebook-convert 工具
        String command = String.format("ebook-convert \"%s\" \"%s\"", inputFilePath, outputFilePath);

        // 启动进程
        Process process = Runtime.getRuntime().exec(command);
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

        // 记录开始时间
        long startTime = System.currentTimeMillis();

        // 读取输出并显示进度
        String line;
        while ((line = reader.readLine()) != null || (line = errorReader.readLine()) != null) {
            // 这里我们假设输出包含进度信息,可以根据具体的输出格式进行调整
            if (line.contains("%")) {
                System.out.println(line); // 打印带有百分比的行
            }
        }

        int exitCode = process.waitFor();

        // 记录结束时间
        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;

        if (exitCode != 0) {
            throw new IOException("Error during conversion process. Exit code: " + exitCode);
        }

        System.out.println("Conversion successful: " + outputFilePath);
        System.out.println("Time taken: " + (duration / 1000) + " seconds");
    }

    private static String getFileExtension(String fileName) {
        int dotIndex = fileName.lastIndexOf('.');
        if (dotIndex > 0 && dotIndex < fileName.length() - 1) {
            return fileName.substring(dotIndex + 1);
        }
        return "";
    }
}

 

代码说明

  1. 启动进程:使用Runtime.getRuntime().exec(command)启动ebook-convert命令,并创建BufferedReader对象读取进程的标准输出和错误输出。
  2. 记录时间:在转换开始时记录开始时间,转换完成后记录结束时间,并计算耗时。
  3. 读取输出:在while循环中读取进程输出,并假设输出包含进度信息(例如百分比)。实际情况下,ebook-convert的输出格式需要根据具体情况调整解析方式。
  4. 显示进度:将包含百分比信息的行打印到控制台,模拟显示进度。
  5. 显示耗时:转换完成后,打印耗时信息。

注意事项

  • 进度信息ebook-convert工具的标准输出可能不包含详细的进度信息,需根据实际输出格式进行解析和调整。
  • 错误处理:在实际应用中,应增加更多的错误处理逻辑,例如捕获和处理可能的异常情况。
  • 优化:如果需要更详细和准确的进度更新,可以考虑使用支持更丰富反馈信息的转换工具或库。

 以下是一个Java程序,用于批量将指定目录下的所有EPUB或MOBI文件转换为PDF文件,并将转换后的PDF文件保存到同一目录中,保持相同的文件名但后缀为PDF。

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class BatchEbookConverter {

    public static void main(String[] args) {
        // 指定要处理的目录路径
        String directoryPath = "C:\\Users\\Administrator\\Downloads\\pdf"; // 修改为实际目录路径

        File directory = new File(directoryPath);

        System.out.println("目录路径"+directoryPath);
        if (!directory.isDirectory()) {
            System.err.println("The provided path is not a directory.");
            System.exit(1);
        }

        File[] files = directory.listFiles((dir, name) -> name.toLowerCase().endsWith(".epub") || name.toLowerCase().endsWith(".mobi"));

        if (files == null || files.length == 0) {
            System.out.println("No EPUB or MOBI files found in the directory.");
            return;
        }

        for (File file : files) {
            String inputFilePath = file.getAbsolutePath();
            String outputFilePath = inputFilePath.substring(0, inputFilePath.lastIndexOf('.')) + ".pdf";

            try {
                convertEbookToPdf(inputFilePath, outputFilePath);
            } catch (IOException | InterruptedException e) {
                System.err.println("Failed to convert file: " + inputFilePath);
                e.printStackTrace();
            }
        }
    }

    public static void convertEbookToPdf(String inputFilePath, String outputFilePath) throws IOException, InterruptedException {
        // 判断文件格式
        String fileExtension = getFileExtension(inputFilePath).toLowerCase();

        if (!fileExtension.equals("epub") && !fileExtension.equals("mobi")) {
            throw new IllegalArgumentException("Unsupported file format. Only EPUB and MOBI are supported.");
        }

        // 使用 Calibre 的 ebook-convert 工具
        String command = String.format("ebook-convert \"%s\" \"%s\"", inputFilePath, outputFilePath);

        // 启动进程
        Process process = Runtime.getRuntime().exec(command);
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

        // 记录开始时间
        long startTime = System.currentTimeMillis();

        // 读取输出并显示进度
        String line;
        while ((line = reader.readLine()) != null || (line = errorReader.readLine()) != null) {
            // 这里我们假设输出包含进度信息,可以根据具体的输出格式进行调整
            if (line.contains("%")) {
                System.out.println(line); // 打印带有百分比的行
            }
        }

        int exitCode = process.waitFor();

        // 记录结束时间
        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;

        if (exitCode != 0) {
            throw new IOException("Error during conversion process. Exit code: " + exitCode);
        }

        System.out.println("Conversion successful: " + outputFilePath);
        System.out.println("Time taken: " + (duration / 1000) + " seconds");
    }

    private static String getFileExtension(String fileName) {
        int dotIndex = fileName.lastIndexOf('.');
        if (dotIndex > 0 && dotIndex < fileName.length() - 1) {
            return fileName.substring(dotIndex + 1);
        }
        return "";
    }
}
05-27 06:32