【发布时间】:2019-08-29 09:35:03
【问题描述】:
在将 PDF 文件上传到文件服务器之前,我正在使用 GhostScript(当前为 9.27)来减小应用程序中 PDF 文件的大小。 我面临的问题是某些 PDF 文件被转换为空白 PDF 文件,但是,如果我使用 Adobe Acrobat 打开原始 PDF 文件并保存它,然后执行我的 GhostScript 程序,它运行良好,PDF 显示并且是正确“压缩”(降低质量)。
我尝试了不同的 PDF 设置,但所需的是 /ebook,所以我想让它与电子书质量一起使用。 我正在使用 GhostScript Wrapper(将在此处发布代码),我正在调用的函数是:
RunGS("-dQUIET", "-dBATCH", "-dNOPAUSE", "-dNOGC", "-dPDFSETTINGS=/ebook", , "-sDEVICE=pdfwrite", "-sOutputFile=" & OUTPUT_FILE, INPUT_FILE)
当最终结果为空白 PDF 文件并返回此错误时,它比平时花费更长的时间:
我刚刚注意到我收到了一个错误回调...它说:
GhostScriptUnrecoverable 错误,退出代码 -100
这是非工作文件(原始):https://docdro.id/YuZslRm
这是开始使用 Acrobat 保存后的文件,效果很好:https://docdro.id/cAoUCS5
这里是包装器,以防万一:
模块 GhostscriptDllLib
Private Declare Function gsapi_new_instance Lib "gsdll32.dll" _
(ByRef instance As IntPtr, _
ByVal caller_handle As IntPtr) As Integer
Private Declare Function gsapi_set_stdio Lib "gsdll32.dll" _
(ByVal instance As IntPtr, _
ByVal gsdll_stdin As StdIOCallBack, _
ByVal gsdll_stdout As StdIOCallBack, _
ByVal gsdll_stderr As StdIOCallBack) As Integer
Private Declare Function gsapi_init_with_args Lib "gsdll32.dll" _
(ByVal instance As IntPtr, _
ByVal argc As Integer, _
<MarshalAs(UnmanagedType.LPArray, ArraySubType:=UnmanagedType.LPStr)> _
ByVal argv() As String) As Integer
Private Declare Function gsapi_exit Lib "gsdll32.dll" _
(ByVal instance As IntPtr) As Integer
Private Declare Sub gsapi_delete_instance Lib "gsdll32.dll" _
(ByVal instance As IntPtr)
'--- Run Ghostscript with specified arguments
Public Function RunGS(ByVal ParamArray Args() As String) As Boolean
Dim InstanceHndl As IntPtr
Dim NumArgs As Integer
Dim StdErrCallback As StdIOCallBack
Dim StdInCallback As StdIOCallBack
Dim StdOutCallback As StdIOCallBack
NumArgs = Args.Count
StdInCallback = AddressOf InOutErrCallBack
StdOutCallback = AddressOf InOutErrCallBack
StdErrCallback = AddressOf InOutErrCallBack
'--- Shift arguments to begin at index 1 (Ghostscript requirement)
ReDim Preserve Args(NumArgs)
System.Array.Copy(Args, 0, Args, 1, NumArgs)
'--- Start a new Ghostscript instance
If gsapi_new_instance(InstanceHndl, 0) <> 0 Then
Return False
Exit Function
End If
'--- Set up dummy callbacks
gsapi_set_stdio(InstanceHndl, StdInCallback, StdOutCallback, StdErrCallback)
'--- Run Ghostscript using specified arguments
gsapi_init_with_args(InstanceHndl, NumArgs + 1, Args)
'--- Exit Ghostscript
gsapi_exit(InstanceHndl)
'--- Delete instance
gsapi_delete_instance(InstanceHndl)
Return True
End Function
'--- Delegate function for callbacks
Private Delegate Function StdIOCallBack(ByVal handle As IntPtr, _
ByVal Strz As IntPtr, ByVal Bytes As Integer) As Integer
'--- Dummy callback for standard input, standard output, and errors
Private Function InOutErrCallBack(ByVal handle As IntPtr, _
ByVal Strz As IntPtr, ByVal Bytes As Integer) As Integer
Dim objString As String
objString = Marshal.PtrToStringAnsi(Strz, Bytes)
Return 0
End Function
关于如何避免这种情况的任何想法?我不介意采取快速流程或其他方式。正如我所说,这只发生在某些特定文件上(我们从客户那里获得),但其中可能有 98% 的文件大小正确减小。
【问题讨论】:
-
您必须提供一个完整 PDF文件来显示问题,它不必在这里,您可以将它放在其他地方并发布链接. PDF 文件的“标题”只是第一行(可选的第二行注释二进制文件),在您的情况下是 %PDF-1.3 行。其余部分是 PDF 文件的正文。如果你有问题,那么你真的应该打开一个错误报告(bugs.ghostscript.com)。您可以使用 Ghostscript 命令行可执行文件重现此问题吗?如果不是,那么它可能是你正在做的事情。如果是,那么您最好打开一个错误。
-
感谢您的建议。我编辑了帖子,添加了 2 个链接。我将尝试学习如何使用命令行执行它并在此处通知。
标签: .net pdf ghostscript