如何将Contents中的流数组转换为PRIndirectRefernce?

时间:2018-04-10 20:45:46

标签: itext pdftotext

我正在尝试阅读pdf并获取其中的文字。使用Nugget iTextSharp -LGPL v4.1.5。 (我不允许使用ITextsharp v5.5.13,这会让生活变得困难)

Observable<List<BaseClass>> b = Observable.just(Collections.emptyList());
Observable<List<SubClass>> s = Observable.just(Collections.emptyList());

observableListMethod(b);
observableListMethod(s); 

获取例外

  

System.InvalidCastException:无法转换类型为&#39; iTextSharp.text.pdf.PdfArray&#39;的对象输入&#39; iTextSharp.text.pdf.PRIndirectReference&#39;。

请建议如何处理PdfArray对象(内容中的多个流)

1 个答案:

答案 0 :(得分:0)

我不太熟悉c#,但java代码应该很容易转移到c# 我会这样做:

private byte[] getTextFromPage(PdfReader pdfReader, int page){
     PdfDictionary cpage = pdfReader.GetPageN(page);
     PdfObject content = cpage.get(PdfName.CONTENTS);

     return getContent(content);
}    

private byte[] getContent(PdfObject content) throws IOException {
          byte[] result=null;
          switch (content.type()){
            case PdfObject.INDIRECT:
              PRIndirectReference ref = (PRIndirectReference) content;
              PdfObject directObject = PdfReader.getPdfObject(ref);
              result = getContent(directObject);
              break;
            case PdfObject.ARRAY:
              ByteArrayOutputStream baos = new ByteArrayOutputStream();
              PdfArray cArray = (PdfArray) content;
              for(Object object : cArray.getArrayList()) {
               baos.write(getContent((PdfObject) object));
              }
              result = baos.toByteArray();
              break;
            case PdfObject.STREAM:
              PRStream stream = (PRStream) PdfReader.getPdfObject(content);
              result = PdfReader.getStreamBytes(stream);
              break;

            default:
              throw new IllegalStateException("Unsupported content type");
          }
          return result;
        }   

但这只是检索文本的一小步。你需要整个操作员处理,引导,间距,缩放,字体处理等。所以从头开始写它是一项重大任务......