///|
/// Read a PDF document from a borrowed byte view.
///
/// This is the high-level non-password reader. It first tries the strict classic
/// xref reader and probes the page tree; for selected structural errors it falls
/// back to reconstruction by scanning indirect objects.
pub fn pdf_read_document_from_view(
  data : BytesView,
) -> PdfDocument raise @core.PdfError {
  pdf_read_probe_page_tree_or_reconstruct(
    data,
    pdf_read_classic_document_from_view(data),
  ) catch {
    StartXRefExpected => pdf_read_reconstructed_document_from_view(data)
    XRefExpected =>
      pdf_read_reconstructed_or_raise(
        data,
        XRefExpected,
        include_xref_stream_trailers=true,
      )
    XRefEntryExpected => pdf_read_reconstructed_after_xref_entry_error(data)
    TrailerExpected => pdf_read_reconstructed_or_raise(data, TrailerExpected)
    RootExpected => pdf_read_reconstructed_after_root_error(data)
    NumberExpected => pdf_read_reconstructed_or_raise(data, NumberExpected)
    ParseIndirectObjectExpected =>
      pdf_read_reconstructed_or_raise(data, ParseIndirectObjectExpected)
    ParseStreamExpected =>
      pdf_read_reconstructed_after_stream_parse_error(data, ParseStreamExpected)
    ParseEndStreamExpected =>
      pdf_read_reconstructed_after_stream_parse_error(
        data,
        ParseEndStreamExpected,
      )
    ParseEndObjectExpected =>
      pdf_read_reconstructed_after_stream_parse_error(
        data,
        ParseEndObjectExpected,
      )
    EndOfInput => pdf_read_reconstructed_or_raise(data, EndOfInput)
    ParseObjectExpected =>
      pdf_read_reconstructed_or_raise(data, ParseObjectExpected)
    InvalidHexEscape => pdf_read_reconstructed_or_raise(data, InvalidHexEscape)
    StreamDataExpected => pdf_read_reconstructed_after_stream_data_error(data)
    InvalidCursorPosition(position) =>
      pdf_read_reconstructed_or_raise(
        data,
        InvalidCursorPosition(position),
        include_xref_stream_trailers=true,
      )
    FilterNotSupported(filter) =>
      pdf_read_reconstructed_after_metadata_decode_error(
        data,
        FilterNotSupported(filter),
      )
    PredictorExpected =>
      pdf_read_reconstructed_after_metadata_decode_error(
        data,
        PredictorExpected,
      )
    PredictorNotSupported(predictor) =>
      pdf_read_reconstructed_after_metadata_decode_error(
        data,
        PredictorNotSupported(predictor),
      )
    error => raise error
  }
}