我遇到了C#应用程序的问题。我试图读取一些PDF文件并将数据加载到数据库中。 仅当PDF文件位于特定文件夹中时,应用程序才能正常工作。该文件夹是项目的调试文件夹。
我需要从任何文件夹加载PDF文件。
public string LecturaPDF(string nombreArchivo)
{
PdfReader lectorPDF = new PdfReader(nombreArchivo);
string TextoPuro = string.Empty;
string[] TextoDividido;
string TextoFinal = string.Empty;
for (int a = 1; a <= lectorPDF.NumberOfPages; a++)
{
ITextExtractionStrategy pdfParser =
new iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy();
TextoPuro = TextoPuro + PdfTextExtractor.GetTextFromPage(lectorPDF, a, pdfParser);
}
lectorPDF.Close();
TextoDividido = TextoPuro.Split('\n');
for (int b = 0; b < TextoDividido.Count(); b++)
{
if (TextoDividido[b].First()== '7')
{
TextoFinal = TextoFinal + TextoDividido[b] + ";";
}
}
return ';' + TextoFinal;
}
此行中出现错误 PdfReader lectorPDF = new PdfReader(nombreArchivo); 错误说:
找不到C:\ user \ me \ MyDocuments \ Projects \ Project1 \ bin \ debug \ test.pdf 作为文件或资源
使用此功能,我打开一个对话框来选择文件并调用该函数来读取pdf文件:
private void cmdProcesar_Click(object sender, RoutedEventArgs e)
{
if (dialogoArchivo.ShowDialog().Value)
{
for (int a = 0; a < dialogoArchivo.FileNames.Count(); a++)
{
lblEstado.Dispatcher.Invoke(DispatcherPriority.Background, (Action)(() => lblEstado.Content =
"Procesando archivos contra Billing..."));
archivo.InsercionArchivo(dialogoArchivo.SafeFileNames[a], G_Fecha,
archivo.LecturaPDF(System.IO.Path.GetFullPath(dialogoArchivo.SafeFileNames[a])),
Convert.ToDouble(txtTarifa.Text),
conexion.ConexionOracle);
}
}
这是我第一次使用C#而且我不知道为什么只有在我从项目调试文件夹中读取文件时才能工作
任何建议都表示赞赏
提前致谢
更新
private void cmdProcesar_Automatico(object sender, RoutedEventArgs e)
{
string carpeta = "C:\\temp";
DirectoryInfo dir = new DirectoryInfo(carpeta);
FileInfo[] documentos = dir.GetFiles("*.pdf");
txtTarifa.Text = "1.48";
foreach (FileInfo archivopdf in documentos)
{
lblEstado.Dispatcher.Invoke(DispatcherPriority.Background, (Action)(() => lblEstado.Content =
"Procesando archivos contra Billing..."));
archivo.InsercionArchivo(archivopdf.Name, G_Fecha,
archivo.LecturaPDF(System.IO.Path.GetFullPath(archivopdf.Name)),
Convert.ToDouble(txtTarifa.Text),
conexion.ConexionOracle);
}
}
我将功能更改为自动读取特定文件夹中的所有文件并处理每个文件。
但是我得到了同样的错误:
找不到C:\ user \ me \ MyDocuments \ Projects \ Project1 \ bin \ debug \ test.pdf 作为文件或资源
答案 0 :(得分:1)
来自OpenFileDialog.SafeFileNames
的{{3}}(强调我的):
获取对话框中所有选定文件的文件名和扩展名数组。 文件名不包含路径。
由于它不包含路径,因此将使用当前路径,当您在调试器中运行时默认为bin \ debug。
如果您知道应该从中选择文件的目录,可以将其添加到文件名中(使用documentation)但如果您更喜欢完整路径,则可以使用FileNames
属性根据{{3}}(再次强调我的):
每个文件名包括文件路径和扩展名。如果未选择任何文件,则此方法返回一个空数组。
在您的上下文中,您需要更改此行:
archivo.LecturaPDF(System.IO.Path.GetFullPath(dialogoArchivo.SafeFileNames[a])),
到
archivo.LecturaPDF(System.IO.Path.GetFullPath(dialogoArchivo.FileNames[a])),
修改强>
要回答编辑中的问题,您将获得FileInfo
中所有pdf
个文件的C:\temp
个对象,但您正在使用System.IO.Path.GetFullPath(archivopdf.Name)
获取文件路径传递给archivo.LecturaPDF
。 Path.Combine
州的文件(再次强调我的):
此方法使用当前目录和当前卷信息来完全限定路径。 如果仅在路径中指定文件名,则GetFullPath将返回当前目录的完全限定路径。
想象一下,文件FileInfo
有c:\temp\example.pdf
。当您在System.IO.Path.GetFullPath(archivopdf.Name)
上致电FileInfo
时,您实际上是在呼叫System.IO.Path.GetFullPath("example.pdf")
。这将给出文件名example.pdf
,但它将使用当前路径作为路径,在您的情况下为C:\user\me\MyDocuments\Projects\Project1\bin\debug\
(运行可执行文件的路径)。
这会产生一个完全限定的文件名C:\user\me\MyDocuments\Projects\Project1\bin\debug\example.pdf
,这不是你想要的,也可能不存在。
由于您已有FileInfo
个对象,因此解决方案非常简单 - 您可以直接使用documentation,而无需致电GetFullPath
。 FullName
属性将为您提供正确的完全限定名称c:\temp\example.pdf
。
因此,您的代码应为:
archivo.InsercionArchivo(archivopdf.Name, G_Fecha,
archivo.LecturaPDF(archivopdf.FullName),
Convert.ToDouble(txtTarifa.Text),
conexion.ConexionOracle);