私はGhostscript.Netを使用してPostScript to PDF Converterを構築しようとしています。 GetArgsが返すArgsは、私が通常gswin32c.exeを呼び出すのに使うもので、正常に動作します。gsapi_init_with_argsが作成されました:-100
しかし、私がプロセスを呼び出すたびに、「gsapi_init_with_args 'を呼び出したときにエラーが発生しました:-100」とエラーが表示されます。そのエラーをグーグルで調べても何も起きなかったので、私はここで尋ねるかもしれないと思った。
Ghostscript.netで直接.dllを呼び出す際に考慮すべき異なる引数がありますか?それとも私は別の場所でミスをしたのですか?
public class PdfConverter
{
#region Private Fields
private List<GhostscriptVersionInfo> _Versions = GhostscriptVersionInfo.GetInstalledVersions(GhostscriptLicense.GPL | GhostscriptLicense.AFPL | GhostscriptLicense.Artifex);
#endregion
#region Private Properties
private GhostscriptVersionInfo Version { get; set; }
#endregion
#region Construction
public PdfConverter()
{
Version = GhostscriptVersionInfo.GetLastInstalledVersion();
}
#endregion
#region Public Members
public bool ConvertToPdf(DirectoryInfo dir)
{
var d = dir;
if(!d.Exists)
return false;
var postScriptFiles = d.GetFiles("*.ps");
var pdfFiles = postScriptFiles.Select(psf => new FileInfo(Path.ChangeExtension(psf.FullName, ".pdf")));
foreach(var file in postScriptFiles) {
//ThreadPool.QueueUserWorkItem(new WaitCallback((o) => {
Process(file, new FileInfo(Path.ChangeExtension(file.FullName, ".pdf")));
//}));
}
pdfFiles.ForEach(pdf => pdf?.Refresh());
return pdfFiles.All(pdf => pdf.Exists);
}
#endregion
#region Private Helpers
private void Process(FileInfo inputFile, FileInfo outputFile)
{
Console.WriteLine($"Converting {inputFile} to {outputFile}");
var proc = new GhostscriptProcessor(Version, true);
proc.Process(GetArgs(inputFile, outputFile).ToArray(), new ConsoleStdIO(true, true, true));
}
private IEnumerable<string> GetArgs(FileInfo inputFile, FileInfo outputFile)
{
return new [] {
$"-q ",
$"-sDEVICE=pdfwrite",
$"-dSAFER",
$"-dNOPAUSE",
$"-dBATCH",
$"-sPAPERSIZE=a4",
$"-dEmbedAllFonts=true",
$"-dAutoRotatePages=/None",
$"-sOutputFile=\"{outputFile.FullName}\"",
$"-dCompatibilityLevel#1.4",
$"-c .setpdfwrite",
$"-f \"{inputFile.FullName}\""
};
}
#endregion
}
編集:
はここに私のクラスだ 私が言及するのを忘れてしまった:私は私自身のGhostsdcriptStdIOクラスをしなければならなかったことを実現するために。私はこのことを正しければ、私は完全にはわからないと認めます。それは例外なしでインスタンス化され、StdOut(...)getをオーバーライドしますが、出力は期待通りにコンソールに書き込まれます。 override void StdError(...)getも呼び出されます。また、駆除されてコンソールに書き込まれます。 エラーbtwの出力は:
"****" c:\ temp \ test.pdf "ファイルを開くことができませんでした。" "****初期デバイスを開くことができません。
はここに私のConsoleStdIOクラスです:
再びpublic class ConsoleStdIO : Ghostscript.NET.GhostscriptStdIO
{
#region Construction
public ConsoleStdIO(bool handleStdIn, bool handleStdOut, bool handleStdError) : base(handleStdIn, handleStdOut, handleStdError) { }
#endregion
#region Overrides
public override void StdError(string error)
{
var foo = Encoding.Default.GetBytes(error);
var lenght = foo.Length;
using (var err = Console.OpenStandardError()) {
if(err.CanWrite)
err.Write(foo, 0, lenght);
}
}
public override void StdIn(out string input, int count)
{
byte[] bytes = new byte[0];
using(var stdInput = Console.OpenStandardInput()) {
stdInput.Read(bytes, 0, count);
}
input = Encoding.Default.GetString(bytes);
}
public override void StdOut(string output)
{
var foo = Encoding.Default.GetBytes(output);
var lenght = foo.Length;
using (var err = Console.OpenStandardError()) {
if(err.CanWrite)
err.Write(foo, 0, lenght);
}
}
#endregion
}
:gswin32c.exeを使用して、まったく同じファイルと引数を使用して同じ操作を行うと、正常に動作します。 ハッピーハッキング
をしかし、その間にfreenodeの上#chsarpでユーザーがGhostscript.NETのソースコードでのバグに私を指摘します。https:// github.com/jhabjan/Ghostscript.NET/blob/6c74b1e416dea215754c8679fcc1f3caf0b085c3/Ghostscript.NET/Processor/GhostscriptProcessor.cs#L282 システムのデフォルトではargsをエンコードしますが、UTF8である必要があります。とにかく、Ghostscript.NETのソースコードをダウンロードして変更しました。しかし、それは動作しませんでした。 そして、未定義のファイル名であるというエラーはあまり意味がありません。ファイルが存在し、私の一時フォルダは確かに特別なものではないので、私はそれを作成しました。 – Mathew
最初のコメント:あなたが言ったようにすべてのスイッチを削除しましたが、次のエラーが表示されます:/ undefinedfilename in( "C:\\ temp \\ pdftest \\ temp1.ps") – Mathew
3番目のコメント: ://pastebin.com/n9efzBRa – Mathew