PDF读取内容流时出错

时间:2018-02-12 03:50:44

标签: pdf pdf-generation postscript

我正在捕获对deriving的postscript调用,并将当前字体和字体大小存储到pdf Text对象的输出中。

PDF file
Input Postscript Program

但是public class MainActivity extends AppCompatActivity { EditText et_message; FloatingActionButton fab_send; API api; ListView list_view_conversation; List<ChatModel> list_chat = new ArrayList<>(); RevealDetailsCallbacks callback; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_message = (EditText) findViewById(R.id.et_message); fab_send = (FloatingActionButton) findViewById(R.id.fab_send); list_view_conversation = (ListView) findViewById(R.id.list_view_conversation); Retrofit retrofit = new Retrofit.Builder() .baseUrl(API.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); api = retrofit.create(API.class); fab_send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //this method ultimately is to get response and send back to user String s = et_message.getText().toString(); ChatModel model = new ChatModel(s, true); list_chat.add(model); new retrieveDetails().execute(list_chat); et_message.setText("'"); } }); } public class retrieveDetails extends AsyncTask<List<ChatModel>, Void, String> { String text = et_message.getText().toString(); String mainReply = ""; List<ChatModel> models; List<String> details = new ArrayList<String>(); @Override public String doInBackground(List<ChatModel>[] lists) { Call<List<Patient>> call = api.getPatients(); models = lists[0]; call.enqueue(new Callback<List<Patient>>() { public String reply; @Override public void onResponse(Call<List<Patient>> call, Response<List<Patient>> response) { List<Patient> patients = response.body(); for (int i = 0; i < patients.size(); i++) { if (patients.get(i).getNric().equals(text)) { details.add("Name: " + patients.get(i).getName() + "\nNRIC: " + patients.get(i).getNric() + "\nDOB: " + patients.get(i).getDob() + "\nContact No: " + patients.get(i).getContactno()); } } this.mainReply = details.get(0); Log.i("Here Log i", reply); } @Override public void onFailure(Call<List<Patient>> call, Throwable t) { Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show(); } }); return mainReply;//I want to reply with the data added into the details arraylist in the onResponse segment } @Override public void onPostExecute(String s) { ChatModel chatModel = new ChatModel(s, false); models.add(chatModel); CustomAdapter adapter = new CustomAdapter(models, getApplicationContext()); list_view_conversation.setAdapter(adapter); } } } 给了我一个错误:

show

ghostscript的输出并没有给出我理解问题所需的细节:

identify

任何人都可以帮我理解我输出的pdf文件的问题是什么吗?

1 个答案:

答案 0 :(得分:2)

PDF中存在许多错误。根据所讨论的PDF查看器,需要修复其中较小或较大的子集,以允许按预期显示PDF。

页面内容流

页面内容流的内容如下所示:

BT F1 10.0 Tf 30.0 750.0 Td (<< ) Tj ET BT F1 10.0 Tf 50.0 738.0 Td (/) Tj ET [...]

此处的错误出现在字体选择说明中:

F1 10.0 Tf

字体名称操作数 F1 不是作为PDF名称对象给出的(可以通过前导斜杠识别),而是作为通常为指令运算符保留的通用文字。

(另外,这些内容流结构不必要地膨胀,大多数单独的文本对象只绘制一到三个字形,并且拥有(总是相同的)文本字体选择指令。本身不是错误,但完全没必要)< / p>

此外,正如@ usr2564301所示,流长度似乎偏离了1。

字体资源

字体资源如下所示:

<<
  /Type /Font 
  /SubType /Type1 
  /BaseFont /Palatino-Roman 
>>

首先,存在的问题是:正如@KenS已经指出的那样,正确的拼写是子类型,而不是 SubType

还存在另一个问题:因此,只有标准的14种字体才允许使用短的字体资源字典,而PDF格式只允许使用短字体资源字典,而不再允许使用PDF 2.0。由于 Palatino-Roman 显然不是标准的14字体,因此无论如何资源都是不完整的。

根据表109 - ISO 32000-2中的Type 1字体字典中的条目,

  • 类型子类型 BaseFont 通用必需
  • FirstChar LastChar 宽度 FontDescriptor 必需,但在PDF 1.0-1.7中标准14字体可选
  • 名称 在PDF 1.0中是必需的,在PDF 1.1到1.7中是可选的,在PDF 2.0中已弃用
  • 编码 ToUnicode 通常是可选

根据PDF查看器,您尝试的要求可能看起来更宽松,但如果您不符合规范要求,任何PDF处理器都可以合理地拒绝您的PDF。

交叉引用

@ usr2564301还提到许多交叉引用表条目(以及对交叉引用表本身的开头的引用)都是1。

他们确实没有指向对象编号/ xref 文字,而是指向之前的空白区域。由于在数字/文字之前只需要忽略空格,因此很多PDF处理器都不会注意到。