从golang的exec.Command调用ghostscrip时出错

时间:2017-03-21 01:43:47

标签: go ghostscript

这是我的代码, package com.software.roux.diabcalc; import android.content.Intent; import android.content.SharedPreferences; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity { SharedPreferences mPrefs; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setTitle("Insulin Calculator"); mPrefs=this.getSharedPreferences("settings", 0); } public void addclick(View a) throws InterruptedException { if (a.getId() == R.id.add1) { EditText a1 = (EditText) findViewById(R.id.add1); EditText a2 = (EditText) findViewById(R.id.add2); Double currentlevel = Double.parseDouble(a1.getText().toString()); Double carbseaten = Double.parseDouble(a2.getText().toString()); Double oldcurrentlevel = 9999.9; Double oldcarbseaten = 9999.9; try { while(true) { Thread.sleep(1000); if (currentlevel != oldcurrentlevel) { if (carbseaten != oldcarbseaten) { double bolusdose = Double.parseDouble(mPrefs.getString("bolus", "0")); double correctiondose = Double.parseDouble(mPrefs.getString("correction", "0")); double targetlow = Double.parseDouble(mPrefs.getString("low", "0")); double targethigh = Double.parseDouble(mPrefs.getString("high", "0")); double correctto = Double.parseDouble(mPrefs.getString("corrset", "0")); double firststep = 0; if (currentlevel > targethigh) { firststep = ((currentlevel - correctto) / correctiondose); } else if (currentlevel < targetlow) { firststep = ((currentlevel - targethigh) / correctiondose); } else { firststep = 0; } double secondstep = carbseaten / bolusdose; double firstplussecond = firststep + secondstep; double result = 0; result = firstplussecond; TextView t = (TextView) findViewById(R.id.answerobj); t.setText("You Need To Use: " + result + " Units"); } } } } catch (InterruptedException e) { e.printStackTrace(); } } } public void switchclick(View b){ if(b.getId() == R.id.settings) { Intent myIntent = new Intent(MainActivity.this, Settings.class); MainActivity.this.startActivity(myIntent); } } }

显示错误, extraCmds := []string{"-q", "-dBATCH", "-dNOPAUSE", "-dSAFER", "-sDEVICE=pcxmono", fmt.Sprintf("-r%v", dpi), // -r600 "-sOutputFile=BBB%03d.pcx", "WO-BC-CARE.pdf", } s, _ := exec.Command("gs", extraCmds...).Output() reslt := string(s) log.Println(reslt)

听起来无法找到ps库,但是不知道如何使用exec.Command设置gs路径。 感谢您的提前建议。

[更新],我通过将gs从9.20升级到9.21解决了这个问题。使用golang exec.Command时需要注意另一个陷阱。不要在参数中加上引号,比如 2017/03/21 09:24:48 Error: /undefinedfilename in --findlibfile-- Operand stack: () Execution stack: %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval- - 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- fa lse 1 %stopped_push --nostringval-- 1864 1 3 %oparray_pop --nost ringval-- Dictionary stack: --dict:1200/1684(ro)(G)-- --dict:0/20(G)-- --dict:78/200(L)-- Current allocation mode is local Last OS error: No such file or directory 。您必须改为使用"BBB%03d.pcx"

1 个答案:

答案 0 :(得分:0)

错误告诉您文件名未定义,它是一个库文件,并且该文件的名称为空。 ()是字符串分隔符,操作数堆栈的顶部包含该字符串。

遗憾的是,您没有引用整个错误消息,因此我无法分辨您正在使用的Ghostscript版本。我将假设您使用的是Linux,因为您使用过'gs'。你也没有说你在哪里得到你正在使用的Ghostscript版本。

您可以使用-I开关将目录添加到Ghostscript搜索路径,但这似乎不太有用,因为您可能仍在搜索空名称,这显然不会被发现

我首先打印出你发送给exec的确切命令行,然后从shell中尝试,如果可以,那么我们可以进一步发展。