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
我发现,问题在于两个输出文件夹都有 .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)
}
}
}
关键修改:
- 使用完整路径
path而不是仅文件名info.Name() - 为每个PDF文件创建对应的输出目录(移除.pdf扩展名)
- 使用
os.MkdirAll确保目录存在 - 添加更详细的日志输出
如果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参数是否接受相对路径或需要绝对路径。

