1.我需要将PDF文件转换为txt.file文件。我的命令似乎有效,因为我在屏幕上获得了转换后的文本,但是以某种方式无法将输出定向到文本文件中。
public static string[] GetArgs(string inputPath, string outputPath)
{
return new[] {
"-q", "-dNODISPLAY", "-dSAFER",
"-dDELAYBIND", "-dWRITESYSTEMDICT", "-dSIMPLE",
"-c", "save", "-f",
"ps2ascii.ps", inputPath, "-sDEVICE=txtwrite",
String.Format("-sOutputFile={0}", outputPath),
"-c", "quit"
};
}
2.是否有Unicode专用.ps?
更新:
发布我完整的代码,也许错误在其他地方。
public static string[] GetArgs(string inputPath, string outputPath)
{
return new[]
{ "-o c:/test.txt",
"-dSIMPLE",
"-sFONTPATH=c:/windows/fonts",
"-dNODISPLAY",
"-dDELAYBIND",
"-dWRITESYSTEMDICT",
"-f",
"C:/Program Files/gs/gs9.05/lib/ps2ascii.ps",
inputPath,
};
}
[DllImport("gsdll64.dll", EntryPoint = "gsapi_new_instance")]
private static extern int CreateAPIInstance(out IntPtr pinstance, IntPtr caller_handle);
[DllImport("gsdll64.dll", EntryPoint = "gsapi_init_with_args")]
private static extern int InitAPI(IntPtr instance, int argc, string[] argv);
[DllImport("gsdll64.dll", EntryPoint = "gsapi_exit")]
private static extern int ExitAPI(IntPtr instance);
[DllImport("gsdll64.dll", EntryPoint = "gsapi_delete_instance")]
private static extern void DeleteAPIInstance(IntPtr instance);`
private static object resourceLock = new object();
private static void Cleanup(IntPtr gsInstancePtr)
{
ExitAPI(gsInstancePtr);
DeleteAPIInstance(gsInstancePtr);
}
private static object resourceLock = new object();
public static void ConvertPdfToText(string inputPath, string outputPath)
{
CallAPI(GetArgs(inputPath, outputPath));
}
public static void ConvertPdfToText(string inputPath, string outputPath)
{
CallAPI(GetArgs(inputPath, outputPath));
}
private static void CallAPI(string[] args)
{
// Get a pointer to an instance of the Ghostscript API and run the API with the current arguments
IntPtr gsInstancePtr;
lock (resourceLock)
{
CreateAPIInstance(out gsInstancePtr, IntPtr.Zero);
try
{
int result = InitAPI(gsInstancePtr, args.Length, args);
if (result < 0)
{
throw new ExternalException("Ghostscript conversion error", result);
}
}
finally
{
Cleanup(gsInstancePtr);
}
}
}
最佳答案
2个问题,2个答案:
-sOutputFile=/path/to/file
或添加以下行 "-sOutputFile=/where/it/should/go",
到您的c#
代码(可以是第一个参数,但是应该在您的第一个"-c"
之前。但是首先要删除您已经在其中的其他-sOutputFile
东西... :-)更新
(注:(由于各种技术原因)可靠地从PDF提取文本非常困难。无论您尝试使用哪种工具,它都根本无法工作。)
在命令行上,以下两个应该适用于最新版本的Ghostscript(当前版本为v9.05)。这将是你自己的工作...
c#
代码。 1.
txtwrite
设备:gswin32c.exe ^
-o c:/path/to/output.txt ^
-dTextFormat=3 ^
-sDEVICE=txtwrite ^
input.pdf
注意:gswin64c.exe
(如果可用)。 -o
语法仅适用于最新版本的Ghostscript。 -o
语法隐式地设置了-dBATCH
和-dNOPAUSE
参数。 -o
速记表不起作用,请将其替换为-dBATCH -dNOPAUSE -sOutputFile=...
。 -dTextFormat
始终设置为3
,因此此处不需要。 “合法”值包括:0
:这将输出XML转义的Unicode以及与文本格式(位置,字体名称,磅值等)有关的信息。仅适用于开发人员。 1
:与0
相同,但将输出文本块。 2
:输出带有BMO(字节顺序标记)的Unicode(UCS2)文本;尝试近似原始文档中文本的布局。 3
:(默认)与2
相同,但是文本使用UTF-8编码。 txtwrite
修饰符的-dTextFormat
设备是Ghostscript的较新 Assets ,因此,如果找到它们,请report bugs。 2.使用
ps2ascii.ps
gswin32c.exe ^
-sstdout=c:/path/to/output.txt ^
-dSIMPLE ^
-sFONTPATH=c:/windows/fonts ^
-dNODISPLAY
-dDELAYBIND ^
-dWRITESYSTEMDICT ^
-f /path/to/ps2ascii.ps ^
input.pdf
注意:txtwrite
设备完全不同的方法,不能与它混合使用! ps2ascii.ps
是一个文件,是Ghostscript调用以提取文本的PostScript程序。它通常位于Ghostscript installdir的/lib
子目录中。去看看它是否真的在那里。 -dSIMPLE
可以用dCOMPLEX
代替,以便打印出额外的信息行(当前颜色,图像存在,矩形填充)。 -sstdout=...
是必需的,因为ps2ascii.ps
PostScript程序仅打印到stdout,并且不能被告知写入文件。因此-sstdout=...
告诉Ghostscript将其标准输出重定向到文件。 3.非Ghostscript方法
不要忽略其他更容易使用的非Ghostscript方法。以下所有内容都是跨平台的,并且也应在Windows上可用:
mudraw -t
已获得GPL许可(或根据需要提供商业许可)。 MuPDF的命令行实用程序,用于从PDF(由执行Ghostscript的同一组开发人员开发)中提取文本。 pdftotext
GPL许可。 Poppler的命令行实用程序(这是XPDF的fork,它也提供pdftotext
)。 podofotxtextract
GPL许可。基于PoDoFo PDF处理库的命令行实用程序。 来自PDFlib.com的Text Extraction Toolkit(商业用途,但可能是免费提供的,仅供我使用-我没有查看最新消息)。可能是所有工具中最强大的文本提取工具...
关于c# - Ghostscript转换PDF并在文本文件中输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11754556/