Golang中Cmd.Exec的使用问题求助

Golang中Cmd.Exec的使用问题求助 我想读取多个PDF文件的文本内容,但未能找到合适的Go库,因此我使用了PDF2Text工具,并编写了以下代码:

package main

import (
	"fmt"
	"log"
	"os"
	"os/exec"
	"path/filepath"
)

func main() {
	var files []string

	root := "."
	err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
		if info.IsDir() {
			return nil
		}
		if filepath.Ext(path) != ".pdf" {
			return nil
		}
		files = append(files, info.Name())
		return nil
	})
	if err != nil {
		panic(err)
	}
	for _, file := range files {
		fmt.Println(file)
		cmd := exec.Command("pdf2text", "-o", "files", file)
		err := cmd.Run()
		if err != nil {
			log.Fatalf("cmd.Run() failed with %s\n", err)
		}
	}
}

这段代码可以正常工作,并将所有PDF文件提取到名为“files”的文件夹中。但由于该工具是演示版本,它会将PDF文件提取成多个文本文件(每页一个文件)。我希望PDF文件被提取到的文件夹名称与文件名本身相同,因此我尝试将:

cmd := exec.Command("pdf2text", "-o", "files", file)

替换为:

cmd := exec.Command("pdf2text", "-o", file, file)

但这并没有生效,没有任何命令被执行,也没有抛出任何错误。

请提供帮助!


更多关于Golang中Cmd.Exec的使用问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

我发现,问题在于两个输出文件夹都有 .pdf 扩展名,所以 pdf2txt 认为我正在转换两个同名的 PDF 文件。

为了解决这个问题,我使用 strings.Split 从第一个字符串(将用作输出目录名)中移除了 .pdf 扩展名,因此我的代码变为:

	for _, file := range files {
		fmt.Println(file)
		s := strings.Split(file, ".")
		cmd := exec.Command("pdf2text", "-o", s[0], file)
		err := cmd.Run()
		if err != nil {
			log.Fatalf("cmd.Run() failed with %s\n", err)
		}
	}

更多关于Golang中Cmd.Exec的使用问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题在于你使用了info.Name()获取文件名,这仅返回文件名(如document.pdf),而不包含路径。当你尝试将file作为输出目录参数时,pdf2text工具可能无法正确解析相对路径或创建目录。

你需要为每个PDF文件创建对应的输出目录,并确保使用正确的文件路径。以下是修改后的代码示例:

package main

import (
	"fmt"
	"log"
	"os"
	"os/exec"
	"path/filepath"
)

func main() {
	var files []string

	root := "."
	err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if info.IsDir() {
			return nil
		}
		if filepath.Ext(path) != ".pdf" {
			return nil
		}
		files = append(files, path)
		return nil
	})
	if err != nil {
		panic(err)
	}

	for _, file := range files {
		fmt.Println("Processing:", file)
		
		// 创建与PDF文件同名的输出目录(不带扩展名)
		outputDir := file[:len(file)-len(filepath.Ext(file))]
		if err := os.MkdirAll(outputDir, 0755); err != nil {
			log.Fatalf("Failed to create directory %s: %v\n", outputDir, err)
		}

		// 执行pdf2text命令
		cmd := exec.Command("pdf2text", "-o", outputDir, file)
		if err := cmd.Run(); err != nil {
			log.Printf("cmd.Run() failed for %s: %v\n", file, err)
		} else {
			fmt.Printf("Successfully processed: %s -> %s\n", file, outputDir)
		}
	}
}

关键修改:

  1. 使用完整路径path而不是仅文件名info.Name()
  2. 为每个PDF文件创建对应的输出目录(移除.pdf扩展名)
  3. 使用os.MkdirAll确保目录存在
  4. 添加更详细的日志输出

如果pdf2text工具对目录路径有特定要求,你可能需要调整outputDir的格式。例如,使用绝对路径:

absPath, _ := filepath.Abs(file)
outputDir := absPath[:len(absPath)-len(filepath.Ext(absPath))]

或者如果你希望输出目录在当前目录下:

baseName := filepath.Base(file)
outputDir := "./" + baseName[:len(baseName)-len(filepath.Ext(baseName))]
cmd := exec.Command("pdf2text", "-o", outputDir, file)

确保检查pdf2text工具的文档,确认-o参数是否接受相对路径或需要绝对路径。

回到顶部