Ghostscript.Net을 사용하여 PostScript에서 PDF로 변환기를 만들려고합니다. GetArgs가 반환하는 Args는 일반적으로 gswin32c.exe를 호출 할 때 사용하는 Args이며 제대로 작동합니다.gsapi_init_with_args가 만들어졌습니다 : -100
하지만 내가 Process를 호출 할 때마다 "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이 호출되었습니다. 그리고 expeted으로 콘솔에 기록됩니다. 오류 btw의 출력은 다음과 같습니다.
"****"c : \ temp \ test.pdf "파일을 열 수 없습니다." "**** 초기 장치를 열 수 없습니다."
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 잘 작동 사용하여 동일한 작업을 수행
여기 내 ConsoleStdIO 클래스입니다. 해피 해킹
그러나 한편으로는 Freenode에 #chsarp의 사용자가 Ghostscript.NET의 소스 코드의 버그로 저를 지적 :
그래서이 작업 GetArgs (...)의 모습입니다 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
세 번째 메모 : 여기에 전체 오류 메시지 : https : //pastebin.com/n9efzBRa – Mathew